Compare commits

...
5 Commits
Author SHA1 Message Date
Li ZongYing d65ac508eb readme 2024-05-31 12:27:23 +08:00
Li ZongYing b372d52510 add license 2024-04-26 20:44:07 +08:00
Li ZongYing 608a7e3fef readme 2024-04-19 18:01:01 +08:00
Li ZongYing b980729224 readme 2024-04-19 17:57:58 +08:00
Li ZongYing 641f8a9108 add time 2024-04-19 15:22:05 +08:00
34 changed files with 928 additions and 303 deletions
+23
View File
@@ -37,6 +37,13 @@ jobs:
# override default build-tools version (29.0.3) -- optional # override default build-tools version (29.0.3) -- optional
BUILD_TOOLS_VERSION: "34.0.0" BUILD_TOOLS_VERSION: "34.0.0"
- name: Get History
id: get_history
run: |
chmod +x history.sh
output=$(./history.sh)
echo "$output" > history.md
- name: Create Release - name: Create Release
id: create_release id: create_release
uses: actions/create-release@v1 uses: actions/create-release@v1
@@ -47,6 +54,7 @@ jobs:
release_name: Release ${{ github.ref }} release_name: Release ${{ github.ref }}
draft: false draft: false
prerelease: false prerelease: false
body_path: history.md
- name: Upload Release Asset - name: Upload Release Asset
uses: actions/upload-release-asset@v1 uses: actions/upload-release-asset@v1
@@ -57,3 +65,18 @@ jobs:
asset_path: ${{ steps.sign_app.outputs.signedReleaseFile }} asset_path: ${{ steps.sign_app.outputs.signedReleaseFile }}
asset_name: my-tv-${{ github.ref_name }}.apk asset_name: my-tv-${{ github.ref_name }}.apk
asset_content_type: application/vnd.android.package-archive asset_content_type: application/vnd.android.package-archive
- name: Gitee Create Release
run: |
latest_commit=$(git rev-parse HEAD)
history=$(cat history.md)
curl -v POST https://gitee.com/api/v5/repos/${{ github.repository }}/releases \
-H "Content-Type: application/json" \
-d '{
"access_token": "${{ secrets.GITEE_ACCESS_TOKEN}}",
"tag_name": "${{ github.ref_name }}",
"name": "Release ${{ github.ref_name }}",
"body": "'"$history"'",
"prerelease": false,
"target_commitish": "'"$latest_commit"'"
}'
+203 -105
View File
@@ -1,167 +1,265 @@
## 更新日志 ## 更新日誌
### v2.1.0
* 恢復播放
### 以下已不可用
### v2.0.9
* 修復部分設備閃退的問題
* 修復設置頁可能顯示不全的問題
### v2.0.5
* 設置頁增加恢復默認按鈕,目前只用於同步系統時間
### v2.0.4
* 修復不能播放的問題
* 包含國際頻道
### v2.0.3
* 修復不能播放的問題
* 不包含國際頻道
### v2.0.0
* 解決卡頓問題
* 解決網格樣式時,點擊空白處不退出的問題
* 解決頻道列表樣式切換可能不生效的問題
### v1.9.8(通用)
* 優化在線升級
* 優化可能狀態錯誤的問題
### v1.9.6(通用)
* 優化在線升級
* 優化可能狀態錯誤的問題
### v1.9.4(通用)
* 修復默認時間不顯示問題
* 設置頁居中
* 頻道號和時間對齊
### v1.9.2(通用)
* 修復一個重試的錯誤
### v1.9.0(通用)
* 減少視頻播放失敗情況
* 全面屏手機居中顯示
### v1.8.8(通用)
* 樣式優化
### v1.8.6(通用)
* 增加錯誤顯示
* 節目預告優化
* 頻道列表頁單擊切換頻道
### v1.8.4(通用)
* 解決部分情況下打開後黑屏問題
* 延長頻道信息顯示時間,增加信息顯示長度
* 調整頻道列表間距
* 其他樣式優化
### v1.8.2(通用)
* 修復無法播放問題
### v1.8.0(通用)
* 修復返回鍵無法退出問題
* 設置中增加退出按鈕
* 修改非電視上的樣式
* 修復低版本閃退問題
### v1.7.8(通用)
* 修復播放過程中的卡頓問題
* 增加時間顯示
* 頻道號優化
* 遙控器左鍵打開頻道列表
* 遙控器右鍵打開設置菜單
* 頻道列表空白處點擊隱藏頻道列表
### v1.7.6(通用) ### v1.7.6(通用)
* 临时去掉部分频道,提高频道的可用性 * 臨時去掉部分頻道,提高頻道的可用性
* 部分频道增加节目单 * 部分頻道增加節目單
### v1.7.5(安卓5及以上專用)
* 修復播放過程中的卡頓問題
* 增加時間顯示
* 頻道號優化
* 設置中增加退出按鈕
### v1.7.4(通用) ### v1.7.4(通用)
* 修复368 * 修復368
### v1.7.3(安卓5及以上专用) ### v1.7.3(安卓5及以上專用)
* 临时去掉部分频道,提高频道的可用性 * 臨時去掉部分頻道,提高頻道的可用性
* 部分频道增加节目单 * 部分頻道增加節目單
* 遥控器左键进入节目列表 * 遙控器左鍵進入節目列表
* 遥控器右键进入菜单 * 遙控器右鍵進入菜單
### v1.7.2(通用) ### v1.7.2(通用)
* 支持节目列表网格样式和行样式切换,软件重启后生效 * 支持節目列表網格樣式和行樣式切換,軟件重啟後生效
* 节目列表样式变更 * 節目列表樣式變更
### v1.7.1(安卓5及以上专用) ### v1.7.1(安卓5及以上專用)
* 解决设置页更新闪退的问题 * 解決設置頁更新閃退的問題
* 凤凰卫视回归 * 鳳凰衛視回歸
* 解决368问题 * 解決368問題
### v1.7.0(通用) ### v1.7.0(通用)
* 网络请求优化 * 網絡請求優化
### v1.6.9(安卓5及以上专用) ### v1.6.9(安卓5及以上專用)
* 去掉港澳台和国际频道 * 去掉港澳台和國際頻道
* 解决部分情况下3、6、8等频道无法播放的问题 * 解決部分情況下3、6、8等頻道無法播放的問題
* 解决部分情况下启动后黑屏问题 * 解決部分情況下啟動後黑屏問題
### v1.6.8(通用) ### v1.6.8(通用)
* 修复部分设备崩溃的问题 * 修復部分設備崩潰的問題
* 修复部分设备凤凰卫视无法播放的问题 * 修復部分設備鳳凰衛視無法播放的問題
### v1.6.7(安卓5及以上专用) ### v1.6.7(安卓5及以上專用)
* 手机双击打开配置 * 手機雙擊打開配置
* 自动更新 * 自動更新
### v1.6.6(通用) ### v1.6.6(通用)
* 更新重庆卫视图标 * 更新重慶衛視圖標
* 凤凰卫视增强画质 * 鳳凰衛視增強畫質
* 凤凰卫视增加EPG * 鳳凰衛視增加EPG
### v1.6.5(安卓5及以上专用) ### v1.6.5(安卓5及以上專用)
* 增加CETV1图标 * 增加CETV1圖標
* 稳定性提升 * 穩定性提升
### v1.6.4(通用) ### v1.6.4(通用)
* 增加CETV1 * 增加CETV1
* 增加凤凰卫视 * 增加鳳凰衛視
* 默认关闭开机启动 * 默認關閉開機啟動
### v1.6.3(安卓5及以上专用) ### v1.6.3(安卓5及以上專用)
* 增加CETV1 * 增加CETV1
* 凤凰卫视增强画质 * 鳳凰衛視增強畫質
* 默认关闭开机启动 * 默認關閉開機啟動
* 延迟菜单自动关闭时间 * 延遲菜單自動關閉時間
* 解决一些可能导致首次打开时黑屏的问题 * 解決一些可能導致首次打開時黑屏的問題
### v1.6.2(通用) ### v1.6.2(通用)
* 修复按键无效的问题 * 修復按鍵無效的問題
* 新的频道列表样式 * 新的頻道列表樣式
### v1.6.1(安卓5及以上专用) ### v1.6.1(安卓5及以上專用)
* 增加凤凰卫视 * 增加鳳凰衛視
### v1.6.0(通用) ### v1.6.0(通用)
* 通用(春晚緊急修復) * 通用(春晚緊急修復)
### v1.5.9(安卓5及以上专用) ### v1.5.9(安卓5及以上專用)
* 解决天猫魔盒闪退问题 * 解決天貓魔盒閃退問題
### v1.5.8(通用) ### v1.5.8(通用)
* 修复央视6画质差的问题 * 修復央視6畫質差的問題
* 增加兵团卫视 * 增加兵團衛視
* 播放失败重试 * 播放失敗重試
### v1.5.7(安卓5及以上专用) ### v1.5.7(安卓5及以上專用)
* 修复播放失败的问题 * 修復播放失敗的問題
### v1.5.6(通用) ### v1.5.6(通用)
* 解决部分设备系统时间不对导致播放失败的问题 * 解決部分設備系統時間不對導致播放失敗的問題
### v1.5.5(安卓5及以上专用) ### v1.5.5(安卓5及以上專用)
* 修复播放失败的问题 * 修復播放失敗的問題
* 修复APP恢复后频道号、频道列表不自动消失的问题 * 修復APP恢復後頻道號、頻道列表不自動消失的問題
### v1.5.4(通用) ### v1.5.4(通用)
* 修复播放失败的问题 * 修復播放失敗的問題
### 以下已不可用 ### v1.5.3(安卓5及以上專用)
### v1.5.3(安卓5及以上专用) * 修復部分情況下APP切換後無法繼續播放的問題
* 優化重試邏輯
* 修复部分情况下APP切换后无法继续播放的问题
* 优化重试逻辑
### v1.5.2(通用) ### v1.5.2(通用)
* 修复APP恢复后频道号、频道列表不自动消失的问题 * 修復APP恢復後頻道號、頻道列表不自動消失的問題
### v1.5.1(安卓5及以上专用) ### v1.5.1(安卓5及以上專用)
* 性能优化 * 性能優化
### v1.5.0(通用) ### v1.5.0(通用)
* 修复部分情况下APP切换后无法继续播放的问题 * 修復部分情況下APP切換後無法繼續播放的問題
### v1.4.9(安卓5及以上专用) ### v1.4.9(安卓5及以上專用)
* 同步v1.4.8 * 同步v1.4.8
### v1.4.8(通用) ### v1.4.8(通用)
* 频道号从1开始,CCTV5+为18 * 頻道號從1開始,CCTV5+為18
* 提高CCTV6清晰度 * 提高CCTV6清晰度
* 增加天津卫视、新疆卫视 * 增加天津衛視、新疆衛視
### v1.4.7(安卓5及以上专用) ### v1.4.7(安卓5及以上專用)
* 修复部分用户CCTV13播放过程中卡住的问题 * 修復部分用戶CCTV13播放過程中卡住的問題
* 调整CCTV的频道顺序 * 調整CCTV的頻道順序
### v1.4.6(通用) ### v1.4.6(通用)
* 10以下频道不再需要先按0 * 10以下頻道不再需要先按0
### v1.4.5(安卓5及以上专用) ### v1.4.5(安卓5及以上專用)
* 数字选台配置 * 數字選台配置
### v1.4.4(通用) ### v1.4.4(通用)
* 优化图标显示 * 優化圖標顯示
* 增加换台反转 * 增加換台反轉
### v1.4.3(安卓5及以上专用) ### v1.4.3(安卓5及以上專用)
* 支持频道反转配置 * 支持頻道反轉配置
### v1.4.2(通用) ### v1.4.2(通用)
@@ -169,40 +267,40 @@
### v1.4.1 ### v1.4.1
* 解决部分用户无法打开菜单的问题 * 解決部分用戶無法打開菜單的問題
### v1.4.0 ### v1.4.0
* 解决极个别高版本机型黑屏问题 * 解決極個別高版本機型黑屏問題
### v1.3.9 ### v1.3.9
* 提高稳定性 * 提高穩定性
* 提高连接速度 * 提高連接速度
### v1.3.4 ### v1.3.4
* 部分错误会提示用户 * 部分錯誤會提示用戶
* 菜单3秒钟后自动关闭 * 菜單3秒鐘後自動關閉
### v1.3.3 ### v1.3.3
* 部分错误会提示用户 * 部分錯誤會提示用戶
* 菜单3秒钟后自动关闭 * 菜單3秒鐘後自動關閉
### v1.3.2 ### v1.3.2
* 增加重试,减少因网络问题导致的播放失败 * 增加重試,減少因網絡問題導致的播放失敗
* 优化横幅banner * 優化橫幅banner
### v1.3.1 ### v1.3.1
* 增加CCTV 8K 超高清频道 * 增加CCTV 8K 超高清頻道
* 增加国际频道栏目 * 增加國際頻道欄目
### v1.3.0 ### v1.3.0
* 处理368可能失败的情形 * 處理368可能失敗的情形
### v1.2.9 ### v1.2.9
@@ -214,32 +312,32 @@
### v1.2.7 ### v1.2.7
* 此版本是为了测试安卓6.0以下版本,如之前可以正常运行,请勿安装。 * 此版本是為了測試安卓6.0以下版本,如之前可以正常運行,請勿安裝。
### v1.2.6 ### v1.2.6
* 支持安卓4.2 * 支持安卓4.2
* 解决部分频道无法播放的问题 * 解決部分頻道無法播放的問題
* 修复切换时有时没有恢复播放的问题 * 修復切換時有時沒有恢復播放的問題
* 左右键不再切换源 * 左右鍵不再切換源
* 增大频道信息标题尺寸,缩小与节目信息的间隔 * 增大頻道信息標題尺寸,縮小與節目信息的間隔
### v1.2.5 ### v1.2.5
* 美化频道信息显示 * 美化頻道信息顯示
* 优化节目单获取 * 優化節目單獲取
### v1.2.4 ### v1.2.4
* 改变换台滑动方向,上一个频道下滑,下一个频道上滑 * 改變換台滑動方向,上一個頻道下滑,下一個頻道上滑
* 软件退出时,退出播放器 * 軟件退出時,退出播放器
* 播放相同的频道,不再重复加载 * 播放相同的頻道,不再重複加載
* 暂时移除部分频道 * 暫時移除部分頻道
### v1.2.3 ### v1.2.3
* 固定视频比列为16:9 * 固定視頻比例為16:9
* 隐藏全面屏底部的小横条 * 隱藏全面屏底部的小橫條
* 移除移动专区 * 移除移動專區
* 修复一个闪退问题 * 修復一個閃退問題
* 更换图标和应用名 * 更換圖標和應用名
+9 -1
View File
@@ -1,6 +1,6 @@
.PHONY: all .PHONY: all
all: info all: info gen-version
branch := $(shell git rev-parse --abbrev-ref HEAD) branch := $(shell git rev-parse --abbrev-ref HEAD)
commit := $(shell git rev-parse --short HEAD) commit := $(shell git rev-parse --short HEAD)
@@ -9,3 +9,11 @@ info:
@echo 'SHELL='$(SHELL) @echo 'SHELL='$(SHELL)
@echo 'branch='$(branch) @echo 'branch='$(branch)
@echo 'commit='$(commit) @echo 'commit='$(commit)
gen-version:
git describe --tags --always
git describe --tags --always | sed 's/v/ /g' | sed 's/\./ /g' | sed 's/-/ /g' | awk '{print ($$1*16777216)+($$2*65536)+($$3*256)+$$4}'
#make gen v=v2.0.0
gen:
echo $(v) | sed 's/v/ /g' | sed 's/\./ /g' | sed 's/-/ /g' | awk '{print "{\"version_code\": " ($$1*16777216)+($$2*65536)+($$3*256)+$$4 ", \"version_name\": \"" "v$(v)" "\"}"}' > version.json
+31 -17
View File
@@ -4,17 +4,16 @@
## 使用 ## 使用
下载安装: 1. 下载
[github](https://github.com/lizongying/my-tv/releases/) * [github](https://github.com/lizongying/my-tv/releases/)
[gitee](https://gitee.com/lizongying/my-tv/releases/) * [gitee](https://gitee.com/lizongying/my-tv/releases/)
2. 安裝
小米电视可以使用小米电视助手进行安装 * U盘安装
* 小米电视可以使用小米电视助手进行安装
如电视可以启用ADB,也可以通过ADB进行安装: * 如电视可以启用ADB,也可以通过ADB进行安装
```shell
```shell adb install my-tv.apk
adb install my-tv.apk ```
```
![image](./screenshots/img_3.png) ![image](./screenshots/img_3.png)
![image](./screenshots/img_2.png) ![image](./screenshots/img_2.png)
@@ -32,12 +31,27 @@ adb install my-tv.apk
* 地方频道 * 地方频道
* 收藏夹 * 收藏夹
* 海外 * 海外
* 节目增加预告 * 隐藏频道
* 频道列表优化 * 亮度调节
* 自动更新 * 音量调节
* 显示时间 * 軟解
* 软解 * 自動更新
* 不同分辨率
無法自啟的設備:
斐讯N1盒子,[Phicomm] Phicomm p230 (Android 7.1.2)
閃退:
中国移动盒子(新魔百和M302A) 4.4.2
## 版权说明
[LICENSE](./LICENSE)
本项目仅供学习研究,禁止用于商业用途,请于下载二十四小时内删除。
本项目可能随时终止,请大家谨慎使用,建议使用官方渠道进行观看。
本项目使用的部分代码、图片、文字等资源来源于网络,如有侵权,请联系删除。
## 赞赏 ## 赞赏
+12 -8
View File
@@ -13,7 +13,7 @@ android {
defaultConfig { defaultConfig {
applicationId "com.lizongying.mytv" applicationId "com.lizongying.mytv"
minSdk 17 minSdk 21
targetSdk 33 targetSdk 33
versionCode VersionCode() versionCode VersionCode()
versionName VersionName() versionName VersionName()
@@ -95,7 +95,7 @@ static def VersionName() {
} }
dependencies { dependencies {
def media3_version = "1.2.1" def media3_version = "1.3.1"
implementation "androidx.media3:media3-ui:$media3_version" implementation "androidx.media3:media3-ui:$media3_version"
@@ -105,18 +105,22 @@ dependencies {
// For HLS playback support with ExoPlayer // For HLS playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-hls:$media3_version" implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
// 21:2.9.0 17:2.6.4 // 21:2.11.0 17:2.6.4
def retrofit2_version = "2.9.0" def retrofit2_version = "2.11.0"
implementation 'com.google.protobuf:protobuf-kotlin:3.25.1' implementation 'com.google.protobuf:protobuf-kotlin:3.25.1'
implementation "com.squareup.retrofit2:converter-gson:$retrofit2_version" implementation "com.squareup.retrofit2:converter-gson:$retrofit2_version"
implementation "com.squareup.retrofit2:converter-protobuf:$retrofit2_version" implementation "com.squareup.retrofit2:converter-protobuf:$retrofit2_version"
implementation "com.squareup.retrofit2:retrofit:$retrofit2_version" implementation "com.squareup.retrofit2:retrofit:$retrofit2_version"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2"
implementation 'androidx.core:core-ktx:1.11.0-beta02' implementation 'androidx.leanback:leanback:1.2.0-alpha04'
implementation 'androidx.leanback:leanback:1.2.0-alpha02'
implementation 'com.github.bumptech.glide:glide:4.11.0' implementation 'com.github.bumptech.glide:glide:4.11.0'
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.2"
implementation 'androidx.core:core-ktx:1.13.0'
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.7.0"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2"
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0-RC") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0-RC")
implementation 'com.google.android.exoplayer:exoplayer-ui:2.13.3' implementation 'com.google.android.exoplayer:exoplayer-ui:2.13.3'
+18 -10
View File
@@ -1,37 +1,43 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-feature <uses-feature
android:name="android.hardware.touchscreen" android:name="android.hardware.touchscreen"
android:required="false" /> android:required="false" />
<uses-feature <uses-feature
android:name="android.software.leanback" android:name="android.software.leanback"
android:required="true" /> android:required="true" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application <application
android:name=".MyApplication"
android:allowBackup="true" android:allowBackup="true"
android:largeHeap="true"
android:icon="@drawable/logo"
android:logo="@drawable/logo"
android:banner="@drawable/banner" android:banner="@drawable/banner"
android:icon="@drawable/logo"
android:label="@string/app_name" android:label="@string/app_name"
android:supportsRtl="true" android:largeHeap="true"
android:logo="@drawable/logo"
android:networkSecurityConfig="@xml/network" android:networkSecurityConfig="@xml/network"
android:usesCleartextTraffic="true" android:supportsRtl="true"
android:theme="@style/Theme.MyTV"> android:theme="@style/Theme.MyTV"
android:usesCleartextTraffic="true">
<activity <activity
android:keepScreenOn="true"
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"
android:keepScreenOn="true"
android:screenOrientation="landscape"> android:screenOrientation="landscape">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<receiver <receiver
android:name=".BootReceiver" android:name=".BootReceiver"
android:exported="true"> android:exported="true">
@@ -40,15 +46,17 @@
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver android:name=".NetworkChangeReceiver" <receiver
android:name=".NetworkChangeReceiver"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<provider <provider
android:name=".InitializerProvider" android:name=".InitializerProvider"
android:authorities="${applicationId}.InitializerProvider" android:authorities="${applicationId}.InitializerProvider"
android:exported="false"/> android:exported="false" />
</application> </application>
</manifest> </manifest>
Binary file not shown.
@@ -23,7 +23,7 @@ class CardPresenter(
return ViewHolder(cardView) return ViewHolder(cardView)
} }
override fun onBindViewHolder(viewHolder: ViewHolder, item: Any) { override fun onBindViewHolder(viewHolder: ViewHolder, item: Any?) {
val tvViewModel = item as TVViewModel val tvViewModel = item as TVViewModel
val cardView = viewHolder.view as ImageCardView val cardView = viewHolder.view as ImageCardView
@@ -31,10 +31,12 @@ class CardPresenter(
cardView.setMainImageDimensions(CARD_WIDTH, CARD_HEIGHT) cardView.setMainImageDimensions(CARD_WIDTH, CARD_HEIGHT)
cardView.tag = tvViewModel.videoUrl.value cardView.tag = tvViewModel.videoUrl.value
Glide.with(viewHolder.view.context) cardView.mainImageView?.let {
.load(tvViewModel.getTV().logo) Glide.with(viewHolder.view.context)
.centerInside() .load(tvViewModel.getTV().logo)
.into(cardView.mainImageView) .centerInside()
.into(it)
}
cardView.setBackgroundColor(Color.WHITE) cardView.setBackgroundColor(Color.WHITE)
cardView.setMainImageScaleType(ImageView.ScaleType.CENTER_INSIDE) cardView.setMainImageScaleType(ImageView.ScaleType.CENTER_INSIDE)
@@ -2,6 +2,7 @@ package com.lizongying.mytv
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@@ -16,6 +17,7 @@ class ChannelFragment : Fragment() {
private val handler = Handler() private val handler = Handler()
private val delay: Long = 3000 private val delay: Long = 3000
private var channel = 0 private var channel = 0
private var channelCount = 0
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
@@ -23,7 +25,39 @@ class ChannelFragment : Fragment() {
): View { ): View {
_binding = ChannelBinding.inflate(inflater, container, false) _binding = ChannelBinding.inflate(inflater, container, false)
_binding!!.root.visibility = View.GONE _binding!!.root.visibility = View.GONE
(activity as MainActivity).fragmentReady()
val activity = requireActivity()
val application = activity.applicationContext as MyApplication
val displayMetrics = application.getDisplayMetrics()
displayMetrics.density
var screenWidth = displayMetrics.widthPixels
var screenHeight = displayMetrics.heightPixels
if (screenHeight > screenWidth) {
screenWidth = displayMetrics.heightPixels
screenHeight = displayMetrics.widthPixels
}
val ratio = 16f / 9f
if (screenWidth / screenHeight > ratio) {
val x = ((screenWidth - screenHeight * ratio) / 2).toInt()
val originalLayoutParams =
binding.channelFragment.layoutParams as ViewGroup.MarginLayoutParams
originalLayoutParams.rightMargin += x
binding.channelFragment.layoutParams = originalLayoutParams
}
if (screenWidth / screenHeight < ratio) {
val y = ((screenHeight - screenWidth / ratio) / 2).toInt()
val originalLayoutParams =
binding.channelFragment.layoutParams as ViewGroup.MarginLayoutParams
originalLayoutParams.topMargin += y
binding.channelFragment.layoutParams = originalLayoutParams
}
(activity as MainActivity).fragmentReady("ChannelFragment")
return binding.root return binding.root
} }
@@ -36,11 +70,17 @@ class ChannelFragment : Fragment() {
} }
fun show(channel: String) { fun show(channel: String) {
this.channel = "${binding.channelContent.text}$channel".toInt() if (channelCount > 1) {
return
}
channelCount++
Log.i(TAG, "channelCount ${channelCount}")
this.channel = "${this.channel}$channel".toInt()
Log.i(TAG, "this.channel ${this.channel}")
handler.removeCallbacks(hideRunnable) handler.removeCallbacks(hideRunnable)
handler.removeCallbacks(playRunnable) handler.removeCallbacks(playRunnable)
if (binding.channelContent.text == "") { if (channelCount < 2) {
binding.channelContent.text = channel binding.channelContent.text = "${this.channel}"
view?.visibility = View.VISIBLE view?.visibility = View.VISIBLE
handler.postDelayed(playRunnable, delay) handler.postDelayed(playRunnable, delay)
} else { } else {
@@ -64,12 +104,18 @@ class ChannelFragment : Fragment() {
private val hideRunnable = Runnable { private val hideRunnable = Runnable {
binding.channelContent.text = "" binding.channelContent.text = ""
view?.visibility = View.GONE view?.visibility = View.GONE
channel = 0
channelCount = 0
Log.i(TAG, "hideRunnable")
} }
private val playRunnable = Runnable { private val playRunnable = Runnable {
(activity as MainActivity).play(channel - 1) (activity as MainActivity).play(channel - 1)
binding.channelContent.text = "" binding.channelContent.text = ""
view?.visibility = View.GONE view?.visibility = View.GONE
channel = 0
channelCount = 0
Log.i(TAG, "playRunnable")
} }
override fun onDestroyView() { override fun onDestroyView() {
@@ -24,7 +24,7 @@ class InfoFragment : Fragment() {
): View { ): View {
_binding = InfoBinding.inflate(inflater, container, false) _binding = InfoBinding.inflate(inflater, container, false)
_binding!!.root.visibility = View.GONE _binding!!.root.visibility = View.GONE
(activity as MainActivity).fragmentReady() (activity as MainActivity).fragmentReady("InfoFragment")
return binding.root return binding.root
} }
@@ -31,6 +31,7 @@ class MainActivity : FragmentActivity(), Request.RequestListener {
private val mainFragment = MainFragment() private val mainFragment = MainFragment()
private val infoFragment = InfoFragment() private val infoFragment = InfoFragment()
private val channelFragment = ChannelFragment() private val channelFragment = ChannelFragment()
private var timeFragment = TimeFragment()
private val settingFragment = SettingFragment() private val settingFragment = SettingFragment()
private val errorFragment = ErrorFragment() private val errorFragment = ErrorFragment()
@@ -67,6 +68,7 @@ class MainActivity : FragmentActivity(), Request.RequestListener {
if (savedInstanceState == null) { if (savedInstanceState == null) {
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction()
.add(R.id.main_browse_fragment, playerFragment) .add(R.id.main_browse_fragment, playerFragment)
.add(R.id.main_browse_fragment, timeFragment)
.add(R.id.main_browse_fragment, infoFragment) .add(R.id.main_browse_fragment, infoFragment)
.add(R.id.main_browse_fragment, channelFragment) .add(R.id.main_browse_fragment, channelFragment)
.add(R.id.main_browse_fragment, mainFragment) .add(R.id.main_browse_fragment, mainFragment)
@@ -169,6 +171,7 @@ class MainActivity : FragmentActivity(), Request.RequestListener {
fun settingDelayHide() { fun settingDelayHide() {
handler.removeCallbacks(hideSetting) handler.removeCallbacks(hideSetting)
handler.postDelayed(hideSetting, delayHideSetting) handler.postDelayed(hideSetting, delayHideSetting)
showTime()
} }
fun settingHideNow() { fun settingHideNow() {
@@ -198,11 +201,21 @@ class MainActivity : FragmentActivity(), Request.RequestListener {
} }
} }
fun fragmentReady() { fun fragmentReady(tag: String) {
ready++ ready++
Log.i(TAG, "ready $ready") Log.i(TAG, "ready $tag $ready ")
if (ready == 5) { if (ready == 6) {
mainFragment.fragmentReady() mainFragment.fragmentReady()
showTime()
}
}
private fun showTime() {
Log.i(TAG, "showTime ${SP.time}")
if (SP.time) {
timeFragment.show()
} else {
timeFragment.hide()
} }
} }
@@ -502,7 +515,7 @@ class MainActivity : FragmentActivity(), Request.RequestListener {
.commitNow() .commitNow()
errorFragment.setErrorContent(message) errorFragment.setErrorContent(message)
} }
fragmentReady() fragmentReady("Request")
} }
private companion object { private companion object {
@@ -125,7 +125,7 @@ class MainFragment : BrowseSupportFragment() {
} }
} }
(activity as MainActivity).fragmentReady() (activity as MainActivity).fragmentReady("MainFragment")
} }
fun toLastPosition() { fun toLastPosition() {
@@ -0,0 +1,23 @@
package com.lizongying.mytv
import android.app.Application
import android.content.Context
import android.util.DisplayMetrics
import android.view.WindowManager
class MyApplication : Application() {
private lateinit var displayMetrics: DisplayMetrics
override fun onCreate() {
super.onCreate()
displayMetrics = DisplayMetrics()
val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
// windowManager.defaultDisplay.getRealMetrics(displayMetrics)
windowManager.defaultDisplay.getMetrics(displayMetrics)
}
fun getDisplayMetrics(): DisplayMetrics {
return displayMetrics
}
}
@@ -92,7 +92,7 @@ class PlayerFragment : Fragment(), SurfaceHolder.Callback {
}) })
} }
}) })
(activity as MainActivity).fragmentReady() (activity as MainActivity).fragmentReady("PlayerFragment")
return _binding!!.root return _binding!!.root
} }
@@ -13,6 +13,8 @@ import com.lizongying.mytv.api.FAuthService
import com.lizongying.mytv.api.FEPG import com.lizongying.mytv.api.FEPG
import com.lizongying.mytv.api.Info import com.lizongying.mytv.api.Info
import com.lizongying.mytv.api.InfoV2 import com.lizongying.mytv.api.InfoV2
import com.lizongying.mytv.api.KvcollectRequest
import com.lizongying.mytv.api.KvcollectRequest2
import com.lizongying.mytv.api.LiveInfo import com.lizongying.mytv.api.LiveInfo
import com.lizongying.mytv.api.LiveInfoRequest import com.lizongying.mytv.api.LiveInfoRequest
import com.lizongying.mytv.api.YSP import com.lizongying.mytv.api.YSP
@@ -32,6 +34,7 @@ import retrofit2.Response
import javax.crypto.Cipher import javax.crypto.Cipher
import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec import javax.crypto.spec.SecretKeySpec
import kotlin.random.Random
object Request { object Request {
@@ -39,6 +42,8 @@ object Request {
private var yspTokenService: YSPTokenService = ApiClient().yspTokenService private var yspTokenService: YSPTokenService = ApiClient().yspTokenService
private var yspApiService: YSPApiService = ApiClient().yspApiService private var yspApiService: YSPApiService = ApiClient().yspApiService
private var yspBtraceService: YSPBtraceService = ApiClient().yspBtraceService private var yspBtraceService: YSPBtraceService = ApiClient().yspBtraceService
private var yspBtraceService2: YSPBtraceService = ApiClient().yspBtraceService2
private var yspBtraceService3: YSPBtraceService = ApiClient().yspBtraceService3
private var yspProtoService: YSPProtoService = ApiClient().yspProtoService private var yspProtoService: YSPProtoService = ApiClient().yspProtoService
private var yspJceService: YSPJceService = ApiClient().yspJceService private var yspJceService: YSPJceService = ApiClient().yspJceService
private var fAuthService: FAuthService = ApiClient().fAuthService private var fAuthService: FAuthService = ApiClient().fAuthService
@@ -531,7 +536,7 @@ object Request {
class BtraceRunnable(private val tvModel: TVViewModel) : Runnable { class BtraceRunnable(private val tvModel: TVViewModel) : Runnable {
override fun run() { override fun run() {
fetchBtrace(tvModel) fetchBtrace3(tvModel)
} }
} }
@@ -558,7 +563,116 @@ object Request {
callBtracePage?.enqueue(object : Callback<Void> { callBtracePage?.enqueue(object : Callback<Void> {
override fun onResponse(call: Call<Void>, response: Response<Void>) { override fun onResponse(call: Call<Void>, response: Response<Void>) {
if (response.isSuccessful) { if (response.isSuccessful) {
// Log.d(TAG, "$title kvcollect success") Log.d(TAG, "$title kvcollect success")
} else {
Log.e(TAG, "$title kvcollect status error")
}
handler.postDelayed(btraceRunnable, 60 * 1000)
}
override fun onFailure(call: Call<Void>, t: Throwable) {
Log.e(TAG, "$title kvcollect request error")
handler.postDelayed(btraceRunnable, 60 * 1000)
}
})
tvModel.seq++
}
fun fetchBtrace2(tvModel: TVViewModel) {
callBtracePage?.cancel()
val title = tvModel.getTV().title
val guid = YSP.getGuid()
val pid = tvModel.getTV().pid
val sid = tvModel.getTV().sid
val randomNumber = Random.nextDouble()
val url = tvModel.getTV().videoUrl.first()
val r = KvcollectRequest(
guid = guid,
prog = sid,
viewid = sid,
livepid = pid,
sUrl = "https://www.yangshipin.cn/#/tv/home?pid=$pid",
playno = YSP.getRand(),
rand_str = YSP.getRand(),
ftime = getDateFormat("yyyy-MM-dd HH:mm:ss"),
seq = tvModel.seq,
durl = url,
url = url,
_dc = randomNumber,
)
val e =
"BossId=${r.BossId}&Pwd=${r.Pwd}&_dc=${r._dc}&cdn=${r.cdn}&cmd=${r.cmd}&defn=${r.defn}&downspeed=${r.downspeed}&durl=${r.durl}&errcode=${r.errcode}&fact1=${r.fact1}&firstreport=${r.firstreport}&fplayerver=${r.fplayerver}&ftime=${r.ftime}&geturltime=6&guid=${r.guid}&hc_openid=${r.hc_openid}&hh_ua=${r.hh_ua}&live_type=${r.live_type}&livepid=${r.livepid}&login_type=${r.login_type}&open_id=&openid=${r.openid}&platform=${r.platform}&playno=${r.playno}&prd=${r.prd}&prog=${r.prog}&rand_str=${r.rand_str}&sRef=${r.sRef}&sUrl=${r.sUrl}&sdtfrom=${r.sdtfrom}&seq=${r.seq}&url=${r.url}&viewid=${r.viewid}"
r.signature = YSP.getAuthSignature(e)
callBtracePage = yspBtraceService2.kvcollect2(r)
callBtracePage?.enqueue(object : Callback<Void> {
override fun onResponse(call: Call<Void>, response: Response<Void>) {
if (response.isSuccessful) {
Log.d(TAG, "$title kvcollect success")
} else {
Log.e(TAG, "$title kvcollect status error")
}
handler.postDelayed(btraceRunnable, 60 * 1000)
}
override fun onFailure(call: Call<Void>, t: Throwable) {
Log.e(TAG, "$title kvcollect request error")
handler.postDelayed(btraceRunnable, 60 * 1000)
}
})
tvModel.seq++
}
fun fetchBtrace3(tvModel: TVViewModel) {
callBtracePage?.cancel()
val title = tvModel.getTV().title
val guid = YSP.getGuid()
val pid = tvModel.getTV().pid
val sid = tvModel.getTV().sid
val randomNumber = Random.nextDouble()
val url = tvModel.getTV().videoUrl.first()
val r = KvcollectRequest2(
guid = guid,
prog = sid,
viewid = sid,
livepid = pid,
sUrl = "https://www.yangshipin.cn/#/tv/home?pid=$pid",
playno = YSP.getRand(),
rand_str = YSP.getRand(),
ftime = getDateFormat("yyyy-MM-dd HH:mm:ss"),
seq = tvModel.seq,
durl = url,
url = url,
_dc = randomNumber,
)
val e =
"BossId=${r.BossId}&Pwd=${r.Pwd}&_dc=${r._dc}&cdn=${r.cdn}&cmd=${r.cmd}&defn=${r.defn}&downspeed=${r.downspeed}&durl=${r.durl}&errcode=${r.errcode}&fact1=${r.fact1}&firstreport=${r.firstreport}&fplayerver=${r.fplayerver}&ftime=${r.ftime}&geturltime=${r.geturltime}&guid=${r.guid}&hc_openid=${r.hc_openid}&hh_ua=${r.hh_ua}&live_type=${r.live_type}&livepid=${r.livepid}&login_type=${r.login_type}&open_id=${r.open_id}&openid=${r.openid}&platform=${r.platform}&playno=${r.playno}&prd=${r.prd}&prog=${r.prog}&rand_str=${r.rand_str}&sRef=${r.sRef}&sUrl=${r.sUrl}&sdtfrom=${r.sdtfrom}&seq=${r.seq}&url=${r.url}&viewid=${r.viewid}"
r.signature = YSP.getAuthSignature(e)
callBtracePage = yspBtraceService3.kvcollect3(
guid = r.guid,
prog = r.prog,
viewid = r.viewid,
livepid = r.livepid,
sUrl = r.sUrl,
playno = r.playno,
rand_str = r.rand_str,
ftime = r.ftime,
seq = "${r.seq}",
durl = r.durl,
url = r.url,
_dc = "${r._dc}",
signature = r.signature
)
callBtracePage?.enqueue(object : Callback<Void> {
override fun onResponse(call: Call<Void>, response: Response<Void>) {
if (response.isSuccessful) {
Log.d(TAG, "$title kvcollect success")
} else { } else {
Log.e(TAG, "$title kvcollect status error") Log.e(TAG, "$title kvcollect status error")
} }
@@ -13,9 +13,13 @@ object SP {
// If use channel num to select channel or not // If use channel num to select channel or not
private const val KEY_CHANNEL_NUM = "channel_num" private const val KEY_CHANNEL_NUM = "channel_num"
private const val KEY_TIME = "time"
// If start app on device boot or not // If start app on device boot or not
private const val KEY_BOOT_STARTUP = "boot_startup" private const val KEY_BOOT_STARTUP = "boot_startup"
private const val KEY_GRID = "grid"
// Position in list of the selected channel item // Position in list of the selected channel item
private const val KEY_POSITION = "position" private const val KEY_POSITION = "position"
@@ -39,10 +43,18 @@ object SP {
get() = sp.getBoolean(KEY_CHANNEL_NUM, true) get() = sp.getBoolean(KEY_CHANNEL_NUM, true)
set(value) = sp.edit().putBoolean(KEY_CHANNEL_NUM, value).apply() set(value) = sp.edit().putBoolean(KEY_CHANNEL_NUM, value).apply()
var time: Boolean
get() = sp.getBoolean(KEY_TIME, true)
set(value) = sp.edit().putBoolean(KEY_TIME, value).apply()
var bootStartup: Boolean var bootStartup: Boolean
get() = sp.getBoolean(KEY_BOOT_STARTUP, false) get() = sp.getBoolean(KEY_BOOT_STARTUP, false)
set(value) = sp.edit().putBoolean(KEY_BOOT_STARTUP, value).apply() set(value) = sp.edit().putBoolean(KEY_BOOT_STARTUP, value).apply()
var grid: Boolean
get() = sp.getBoolean(KEY_GRID, false)
set(value) = sp.edit().putBoolean(KEY_GRID, value).apply()
var itemPosition: Int var itemPosition: Int
get() = sp.getInt(KEY_POSITION, 0) get() = sp.getInt(KEY_POSITION, 0)
set(value) = sp.edit().putInt(KEY_POSITION, value).apply() set(value) = sp.edit().putInt(KEY_POSITION, value).apply()
@@ -4,6 +4,7 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import com.lizongying.mytv.databinding.SettingBinding import com.lizongying.mytv.databinding.SettingBinding
@@ -15,6 +16,14 @@ class SettingFragment : DialogFragment() {
private lateinit var updateManager: UpdateManager private lateinit var updateManager: UpdateManager
override fun onStart() {
super.onStart()
dialog?.window?.apply {
addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
}
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, 0) setStyle(STYLE_NO_TITLE, 0)
@@ -46,6 +55,14 @@ class SettingFragment : DialogFragment() {
} }
} }
binding.switchTime.run {
isChecked = SP.time
setOnCheckedChangeListener { _, isChecked ->
SP.time = isChecked
(activity as MainActivity).settingDelayHide()
}
}
binding.switchBootStartup.run { binding.switchBootStartup.run {
isChecked = SP.bootStartup isChecked = SP.bootStartup
setOnCheckedChangeListener { _, isChecked -> setOnCheckedChangeListener { _, isChecked ->
@@ -62,6 +79,10 @@ class SettingFragment : DialogFragment() {
) )
) )
binding.exit.setOnClickListener{
requireActivity().finishAffinity()
}
return binding.root return binding.root
} }
+56 -121
View File
@@ -14,7 +14,7 @@ object TVList {
0, 0,
"CCTV1 综合", "CCTV1 综合",
"CCTV1", "CCTV1",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226231/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/d57905b93540bd15f0c48230dbbbff7ee0d645ff539e38866e2d15c8b9f7dfcd.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/d57905b93540bd15f0c48230dbbbff7ee0d645ff539e38866e2d15c8b9f7dfcd.png?imageMogr2/format/webp",
"600001859", "600001859",
@@ -27,7 +27,7 @@ object TVList {
0, 0,
"CCTV2 财经", "CCTV2 财经",
"CCTV2", "CCTV2",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226195/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/20115388de0207131af17eac86c33049b95d69eaff064e55653a1b941810a006.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/20115388de0207131af17eac86c33049b95d69eaff064e55653a1b941810a006.png?imageMogr2/format/webp",
"600001800", "600001800",
@@ -40,7 +40,7 @@ object TVList {
0, 0,
"CCTV3 综艺", "CCTV3 综艺",
"CCTV3", "CCTV3",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226397/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/7b7a65c712450da3deb6ca66fbacf4f9aee00d3f20bd80eafb5ada01ec63eb3a.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/7b7a65c712450da3deb6ca66fbacf4f9aee00d3f20bd80eafb5ada01ec63eb3a.png?imageMogr2/format/webp",
"600001801", "600001801",
@@ -53,10 +53,7 @@ object TVList {
0, 0,
"CCTV4 中文国际", "CCTV4 中文国际",
"CCTV4", "CCTV4",
listOf( listOf(),
"http://39.134.24.161/dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226191/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226191/index.m3u8"
),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/f357e58fdbcc076a3d65e1f958c942b2e14f14342c60736ceed98b092d35356a.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/f357e58fdbcc076a3d65e1f958c942b2e14f14342c60736ceed98b092d35356a.png?imageMogr2/format/webp",
"600001814", "600001814",
@@ -69,7 +66,7 @@ object TVList {
0, 0,
"CCTV5 体育", "CCTV5 体育",
"CCTV5", "CCTV5",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226395/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/0a6a7138952675983a3d854df7688557b286d59aa06166edae51506f9204d655.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/0a6a7138952675983a3d854df7688557b286d59aa06166edae51506f9204d655.png?imageMogr2/format/webp",
"600001818", "600001818",
@@ -82,7 +79,7 @@ object TVList {
0, 0,
"CCTV6 电影", "CCTV6 电影",
"CCTV6", "CCTV6",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226393/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/741515efda91f03f455df8a7da4ee11fa9329139c276435cf0a9e2af398d5bf2.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/741515efda91f03f455df8a7da4ee11fa9329139c276435cf0a9e2af398d5bf2.png?imageMogr2/format/webp",
"600108442", "600108442",
@@ -95,7 +92,7 @@ object TVList {
0, 0,
"CCTV7 国防军事", "CCTV7 国防军事",
"CCTV7", "CCTV7",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226192/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/b29af94e295ebdf646cefb68122c429b9cd921f498ca20d2d8070252536f9ff9.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/b29af94e295ebdf646cefb68122c429b9cd921f498ca20d2d8070252536f9ff9.png?imageMogr2/format/webp",
"600004092", "600004092",
@@ -108,7 +105,7 @@ object TVList {
0, 0,
"CCTV8 电视剧", "CCTV8 电视剧",
"CCTV8", "CCTV8",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226391/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/ad51de94426a0ba039e6dd6a8534ea98ecc813a6176bde87b4f18cc34d6d7590.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/ad51de94426a0ba039e6dd6a8534ea98ecc813a6176bde87b4f18cc34d6d7590.png?imageMogr2/format/webp",
"600001803", "600001803",
@@ -121,7 +118,7 @@ object TVList {
0, 0,
"CCTV9 纪录", "CCTV9 纪录",
"CCTV9", "CCTV9",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226197/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/2ed1b4deeca179d5db806bb941790f82eb92a1b7299c1c38fe027f95a5caee5e.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/2ed1b4deeca179d5db806bb941790f82eb92a1b7299c1c38fe027f95a5caee5e.png?imageMogr2/format/webp",
"600004078", "600004078",
@@ -134,7 +131,7 @@ object TVList {
0, 0,
"CCTV10 科教", "CCTV10 科教",
"CCTV10", "CCTV10",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226189/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/aa6157ec65188cd41826e5a2f088c3d6d153205f5f6428258d12c59999e221aa.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/aa6157ec65188cd41826e5a2f088c3d6d153205f5f6428258d12c59999e221aa.png?imageMogr2/format/webp",
"600001805", "600001805",
@@ -147,7 +144,7 @@ object TVList {
0, 0,
"CCTV11 戏曲", "CCTV11 戏曲",
"CCTV11", "CCTV11",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226240/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/ed12ed7c7a1034dae4350011fe039284c5d5a836506b28c9e32e3c75299625c0.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/ed12ed7c7a1034dae4350011fe039284c5d5a836506b28c9e32e3c75299625c0.png?imageMogr2/format/webp",
"600001806", "600001806",
@@ -160,7 +157,7 @@ object TVList {
0, 0,
"CCTV12 社会与法", "CCTV12 社会与法",
"CCTV12", "CCTV12",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226190/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/484083cffaa40df7e659565e8cb4d1cc740158a185512114167aa21fa0c59240.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/484083cffaa40df7e659565e8cb4d1cc740158a185512114167aa21fa0c59240.png?imageMogr2/format/webp",
"600001807", "600001807",
@@ -173,9 +170,7 @@ object TVList {
0, 0,
"CCTV13 新闻", "CCTV13 新闻",
"CCTV13", "CCTV13",
listOf( listOf(),
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226233/index.m3u8"
),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/266da7b43c03e2312186b4a999e0f060e8f15b10d2cc2c9aa32171819254cf1a.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/266da7b43c03e2312186b4a999e0f060e8f15b10d2cc2c9aa32171819254cf1a.png?imageMogr2/format/webp",
"600001811", "600001811",
@@ -188,7 +183,7 @@ object TVList {
0, 0,
"CCTV14 少儿", "CCTV14 少儿",
"CCTV14", "CCTV14",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226193/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/af6b603896938dc346fbb16abfc63c12cba54b0ec9d18770a15d347d115f12d5.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/af6b603896938dc346fbb16abfc63c12cba54b0ec9d18770a15d347d115f12d5.png?imageMogr2/format/webp",
"600001809", "600001809",
@@ -201,7 +196,7 @@ object TVList {
0, 0,
"CCTV15 音乐", "CCTV15 音乐",
"CCTV15", "CCTV15",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221225785/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/2ceee92188ef684efe0d8b90839c4f3ad450d179dc64d59beff417059453af47.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/2ceee92188ef684efe0d8b90839c4f3ad450d179dc64d59beff417059453af47.png?imageMogr2/format/webp",
"600001815", "600001815",
@@ -214,10 +209,7 @@ object TVList {
0, 0,
"CCTV16 奥林匹克", "CCTV16 奥林匹克",
"CCTV16-HD", "CCTV16-HD",
listOf( listOf(),
"http://39.134.24.162/dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226921/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226921/index.m3u8"
),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/53793fa7bacd3a93ff6dc5d2758418985e1f952a316c335d663b572d8bdcd74d.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/53793fa7bacd3a93ff6dc5d2758418985e1f952a316c335d663b572d8bdcd74d.png?imageMogr2/format/webp",
"600098637", "600098637",
@@ -230,7 +222,7 @@ object TVList {
0, 0,
"CCTV17 农业农村", "CCTV17 农业农村",
"CCTV17", "CCTV17",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226198/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/ddef563072f8bad2bea5b9e52674cb7b4ed50efb20c26e61994dfbdf05c1e3c0.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/ddef563072f8bad2bea5b9e52674cb7b4ed50efb20c26e61994dfbdf05c1e3c0.png?imageMogr2/format/webp",
"600001810", "600001810",
@@ -243,7 +235,7 @@ object TVList {
0, 0,
"CCTV5+ 体育赛事", "CCTV5+ 体育赛事",
"CCTV5+", "CCTV5+",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226221/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/649ad76a90bfef55b05db9fe52e006487280f619089099d5dc971e387fc6eff0.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/649ad76a90bfef55b05db9fe52e006487280f619089099d5dc971e387fc6eff0.png?imageMogr2/format/webp",
"600001817", "600001817",
@@ -282,7 +274,7 @@ object TVList {
0, 0,
"风云剧场", "风云剧场",
"CCTV风云剧场频道", "CCTV风云剧场频道",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226950/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/4d549e53e6d0f632d5a633d1945280797b153e588f919221a07faa869812cc89.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/4d549e53e6d0f632d5a633d1945280797b153e588f919221a07faa869812cc89.png?imageMogr2/format/webp",
"600099658", "600099658",
@@ -295,7 +287,7 @@ object TVList {
0, 0,
"第一剧场", "第一剧场",
"CCTV第一剧场频道", "CCTV第一剧场频道",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226959/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/a556bd7d93ce65e18f243a8892b5604f4faa994a4897315914216a710a706208.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/a556bd7d93ce65e18f243a8892b5604f4faa994a4897315914216a710a706208.png?imageMogr2/format/webp",
"600099655", "600099655",
@@ -308,7 +300,7 @@ object TVList {
0, 0,
"怀旧剧场", "怀旧剧场",
"CCTV怀旧剧场频道", "CCTV怀旧剧场频道",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226972/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/5661bd04fecdb6e899f801147a22ab5d3a475bf2b62e30aec2c0023190ebc9b1.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/5661bd04fecdb6e899f801147a22ab5d3a475bf2b62e30aec2c0023190ebc9b1.png?imageMogr2/format/webp",
"600099620", "600099620",
@@ -334,7 +326,7 @@ object TVList {
0, 0,
"风云音乐", "风云音乐",
"CCTV风云音乐频道", "CCTV风云音乐频道",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226953/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/bbf1d024c5228b8dd128b0e3cb1717d173fab4ee84c3a4c8a57b1a215362ca3b.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/bbf1d024c5228b8dd128b0e3cb1717d173fab4ee84c3a4c8a57b1a215362ca3b.png?imageMogr2/format/webp",
"600099660", "600099660",
@@ -347,7 +339,7 @@ object TVList {
0, 0,
"兵器科技", "兵器科技",
"CCTV兵器科技频道", "CCTV兵器科技频道",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226975/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/4c6b6a6d3839889f34d33db3c2f80233b26b74d3489b393487635f8704e70796.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/4c6b6a6d3839889f34d33db3c2f80233b26b74d3489b393487635f8704e70796.png?imageMogr2/format/webp",
"600099649", "600099649",
@@ -360,7 +352,7 @@ object TVList {
0, 0,
"风云足球", "风云足球",
"CCTV风云足球频道", "CCTV风云足球频道",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226984/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/cd1e2bb52b06a991de168733e5ff0f1d85adc8042d40c8f393f723543e5dd08a.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/cd1e2bb52b06a991de168733e5ff0f1d85adc8042d40c8f393f723543e5dd08a.png?imageMogr2/format/webp",
"600099636", "600099636",
@@ -373,7 +365,7 @@ object TVList {
0, 0,
"高尔夫网球", "高尔夫网球",
"CCTV高尔夫·网球频道", "CCTV高尔夫·网球频道",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226978/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/cdd1b31ede7a5ad049ed53d9a072422f829e72dd062ed2c19e077fdd01699071.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/cdd1b31ede7a5ad049ed53d9a072422f829e72dd062ed2c19e077fdd01699071.png?imageMogr2/format/webp",
"600099659", "600099659",
@@ -386,7 +378,7 @@ object TVList {
0, 0,
"女性时尚", "女性时尚",
"CCTV女性时尚频道", "CCTV女性时尚频道",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226969/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/fa28955ce8b2539d728bf4c6a13a46ff57ad76eae46627f7bcfb1ed8a613d3fc.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/fa28955ce8b2539d728bf4c6a13a46ff57ad76eae46627f7bcfb1ed8a613d3fc.png?imageMogr2/format/webp",
"600099650", "600099650",
@@ -399,7 +391,7 @@ object TVList {
0, 0,
"央视文化精品", "央视文化精品",
"CCTV央视文化精品频道", "CCTV央视文化精品频道",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226981/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/14ac5ce40482cacd3d4b37435222bfe86af2b452a2f04ecbfc1d13d76edd7c57.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/14ac5ce40482cacd3d4b37435222bfe86af2b452a2f04ecbfc1d13d76edd7c57.png?imageMogr2/format/webp",
"600099653", "600099653",
@@ -412,7 +404,7 @@ object TVList {
0, 0,
"央视台球", "央视台球",
"CCTV央视台球频道", "CCTV央视台球频道",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226956/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/10e14a92478011aa6c3c8562e62127f3b1908e29fcd78e4b2b24b9e6d3ec2fbc.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/10e14a92478011aa6c3c8562e62127f3b1908e29fcd78e4b2b24b9e6d3ec2fbc.png?imageMogr2/format/webp",
"600099652", "600099652",
@@ -425,7 +417,7 @@ object TVList {
0, 0,
"电视指南", "电视指南",
"CCTV电视指南频道", "CCTV电视指南频道",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226987/index.m3u8"), listOf(),
"央视", "央视",
"https://resources.yangshipin.cn/assets/oms/image/202306/244d72c0eb1615ed7d51c2f5db5a67f306aa3f58c05bc2d34de3aa7e956dc8c9.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/244d72c0eb1615ed7d51c2f5db5a67f306aa3f58c05bc2d34de3aa7e956dc8c9.png?imageMogr2/format/webp",
"600099656", "600099656",
@@ -453,7 +445,7 @@ object TVList {
0, 0,
"东方卫视", "东方卫视",
"东方卫视", "东方卫视",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226217/index.m3u8"), listOf(),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/9bd372ca292a82ce3aa08772b07efc4af1f85c21d1f268ea33440c49e9a0a488.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/9bd372ca292a82ce3aa08772b07efc4af1f85c21d1f268ea33440c49e9a0a488.png?imageMogr2/format/webp",
"600002483", "600002483",
@@ -466,10 +458,7 @@ object TVList {
0, 0,
"湖南卫视", "湖南卫视",
"湖南卫视", "湖南卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226307/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226211/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/4120e89d3079d08aa17d382f69a2308ec70839b278367763c34a34666c75cb88.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/4120e89d3079d08aa17d382f69a2308ec70839b278367763c34a34666c75cb88.png?imageMogr2/format/webp",
"600002475", "600002475",
@@ -482,10 +471,7 @@ object TVList {
0, 0,
"湖北卫视", "湖北卫视",
"湖北卫视", "湖北卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226477/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226194/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/7a6be5a2bb1dc53a945c016ff1f525dc4a84c51db371c15c89aa55404b0ba784.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/7a6be5a2bb1dc53a945c016ff1f525dc4a84c51db371c15c89aa55404b0ba784.png?imageMogr2/format/webp",
"600002508", "600002508",
@@ -498,10 +484,7 @@ object TVList {
0, 0,
"辽宁卫视", "辽宁卫视",
"辽宁卫视", "辽宁卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226546/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226201/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/ac4ed6058a87c101ae7147ebc38905d0cae047fb73fd277ee5049b84f52bda36.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/ac4ed6058a87c101ae7147ebc38905d0cae047fb73fd277ee5049b84f52bda36.png?imageMogr2/format/webp",
"600002505", "600002505",
@@ -514,10 +497,7 @@ object TVList {
0, 0,
"江苏卫视", "江苏卫视",
"江苏卫视", "江苏卫视",
listOf( listOf(),
"http://39.134.24.166/dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226200/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226200/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/380ad685c0c1d5b2c902246b8d2df6d3f9b45e2837abcfe493075bbded597a31.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/380ad685c0c1d5b2c902246b8d2df6d3f9b45e2837abcfe493075bbded597a31.png?imageMogr2/format/webp",
"600002521", "600002521",
@@ -530,10 +510,7 @@ object TVList {
0, 0,
"江西卫视", "江西卫视",
"江西卫视", "江西卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226344/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221225764/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/3c760d0d00463855890e8a1864ea4a6b6dd66b90c29b4ac714a4b17c16519871.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/3c760d0d00463855890e8a1864ea4a6b6dd66b90c29b4ac714a4b17c16519871.png?imageMogr2/format/webp",
"600002503", "600002503",
@@ -546,7 +523,7 @@ object TVList {
0, 0,
"山东卫视", "山东卫视",
"山东卫视", "山东卫视",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226209/index.m3u8"), listOf(),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/22d403f07a7cf5410b3ad3ddb65a11aa229a32475fac213f5344c9f0ec330ca1.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/22d403f07a7cf5410b3ad3ddb65a11aa229a32475fac213f5344c9f0ec330ca1.png?imageMogr2/format/webp",
"600002513", "600002513",
@@ -559,7 +536,7 @@ object TVList {
0, 0,
"广东卫视", "广东卫视",
"广东卫视", "广东卫视",
listOf("http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226216/index.m3u8"), listOf(),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/28886880a4dc0f06fb7e0a528a1def0591d61a65870e29176ede0cc92033bbfd.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/28886880a4dc0f06fb7e0a528a1def0591d61a65870e29176ede0cc92033bbfd.png?imageMogr2/format/webp",
"600002485", "600002485",
@@ -572,10 +549,7 @@ object TVList {
0, 0,
"广西卫视", "广西卫视",
"广西卫视", "广西卫视",
listOf( listOf(),
"http://live.gxrb.com.cn/tv/gxtvlive03/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221225770/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/54b7e97cb816bb223fe05f3fc44da2c7820eb66e8550c19d23100f2c414ecc38.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/54b7e97cb816bb223fe05f3fc44da2c7820eb66e8550c19d23100f2c414ecc38.png?imageMogr2/format/webp",
"600002509", "600002509",
@@ -588,10 +562,7 @@ object TVList {
0, 0,
"重庆卫视", "重庆卫视",
"重庆卫视", "重庆卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226409/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226202/index.m3u8"
),
"地方", "地方",
R.drawable.chongqing, R.drawable.chongqing,
"600002531", "600002531",
@@ -604,10 +575,7 @@ object TVList {
0, 0,
"河南卫视", "河南卫视",
"河南卫视", "河南卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226480/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221225767/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/74925962148a6d31c85808b6cd4e444c2a54bab393d2c5fc85e960b50e22fa86.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/74925962148a6d31c85808b6cd4e444c2a54bab393d2c5fc85e960b50e22fa86.png?imageMogr2/format/webp",
"600002525", "600002525",
@@ -620,10 +588,7 @@ object TVList {
0, 0,
"河北卫视", "河北卫视",
"河北卫视", "河北卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226406/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221225750/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/d545becdc81c60197b08c7f47380705e4665ed3fe55efc8b855e486f6e655378.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/d545becdc81c60197b08c7f47380705e4665ed3fe55efc8b855e486f6e655378.png?imageMogr2/format/webp",
"600002493", "600002493",
@@ -636,10 +601,7 @@ object TVList {
0, 0,
"贵州卫视", "贵州卫视",
"贵州卫视", "贵州卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226474/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221225793/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/4eb45f4781d33d872af027dc01c941559aab55667dd99cc5c22bef7037807b13.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/4eb45f4781d33d872af027dc01c941559aab55667dd99cc5c22bef7037807b13.png?imageMogr2/format/webp",
"600002490", "600002490",
@@ -652,10 +614,7 @@ object TVList {
0, 0,
"北京卫视", "北京卫视",
"北京卫视", "北京卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225728/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226222/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/f4f23633c578beea49a3841d88d3490100f029ee349059fa532869db889872c5.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/f4f23633c578beea49a3841d88d3490100f029ee349059fa532869db889872c5.png?imageMogr2/format/webp",
"600002309", "600002309",
@@ -668,10 +627,7 @@ object TVList {
0, 0,
"黑龙江卫视", "黑龙江卫视",
"黑龙江卫视", "黑龙江卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226327/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226215/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/d8273ae9be698ce2db21f5b886ecac95a73429593f93713c60ed8c12c38bf0d3.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/d8273ae9be698ce2db21f5b886ecac95a73429593f93713c60ed8c12c38bf0d3.png?imageMogr2/format/webp",
"600002498", "600002498",
@@ -684,10 +640,7 @@ object TVList {
0, 0,
"浙江卫视", "浙江卫视",
"浙江卫视", "浙江卫视",
listOf( listOf(),
"http://hw-m-l.cztv.com/channels/lantian/channel01/1080p.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226199/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/a66c836bd98ba3e41a2e9a570d4b9c50dedc6839e9de333e2e78212ad505f37e.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/a66c836bd98ba3e41a2e9a570d4b9c50dedc6839e9de333e2e78212ad505f37e.png?imageMogr2/format/webp",
"600002520", "600002520",
@@ -700,10 +653,7 @@ object TVList {
0, 0,
"安徽卫视", "安徽卫视",
"安徽卫视", "安徽卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226391/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226203/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/f35fa04b51b1ee4984b03578b65403570868ebca03c6c01e11b097f999a58d9b.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/f35fa04b51b1ee4984b03578b65403570868ebca03c6c01e11b097f999a58d9b.png?imageMogr2/format/webp",
"600002532", "600002532",
@@ -716,10 +666,7 @@ object TVList {
0, 0,
"深圳卫视", "深圳卫视",
"深圳卫视", "深圳卫视",
listOf( listOf(),
"http://39.134.24.166/dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226205/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226205/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/d59fec04c902e3581c617136d02d4b9b8c4cbe64272781ddd3525e80c823edb7.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/d59fec04c902e3581c617136d02d4b9b8c4cbe64272781ddd3525e80c823edb7.png?imageMogr2/format/webp",
"600002481", "600002481",
@@ -732,10 +679,7 @@ object TVList {
0, 0,
"四川卫视", "四川卫视",
"四川卫视", "四川卫视",
listOf( listOf(),
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221225768/index.m3u8",
"http://39.134.24.166/dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221225768/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/3276a414ae0eaa0f116f2045cd913367967d0c7c1e978e8621ac3879436c6ed7.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/3276a414ae0eaa0f116f2045cd913367967d0c7c1e978e8621ac3879436c6ed7.png?imageMogr2/format/webp",
"600002516", "600002516",
@@ -748,10 +692,7 @@ object TVList {
0, 0,
"东南卫视", "东南卫视",
"福建东南卫视", "福建东南卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226341/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221225766/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/3208fe6564a293c21b711333fb3edb05bb5b406cff840573c9a8d839680a1579.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/3208fe6564a293c21b711333fb3edb05bb5b406cff840573c9a8d839680a1579.png?imageMogr2/format/webp",
"600002484", "600002484",
@@ -764,10 +705,7 @@ object TVList {
0, 0,
"海南卫视", "海南卫视",
"海南卫视", "海南卫视",
listOf( listOf(),
"http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226465/index.m3u8",
"http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221225769/index.m3u8"
),
"地方", "地方",
"https://resources.yangshipin.cn/assets/oms/image/202306/6e060391fde0469801fc3d84dbf204b4f8d650d251f17d7595a6964c0bb99e81.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/6e060391fde0469801fc3d84dbf204b4f8d650d251f17d7595a6964c0bb99e81.png?imageMogr2/format/webp",
"600002506", "600002506",
@@ -875,7 +813,7 @@ object TVList {
0, 0,
"CGTN", "CGTN",
"CGTN", "CGTN",
listOf("http://live.cgtn.com/1000/prog_index.m3u8"), listOf(),
"国际", "国际",
"https://resources.yangshipin.cn/assets/oms/image/202306/a72dff758ca1c17cd0ecc8cedc11b893d208f409d5e6302faa0e9d298848abc3.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/a72dff758ca1c17cd0ecc8cedc11b893d208f409d5e6302faa0e9d298848abc3.png?imageMogr2/format/webp",
"600014550", "600014550",
@@ -888,7 +826,7 @@ object TVList {
0, 0,
"CGTN 法语频道", "CGTN 法语频道",
"CGTN法语频道", "CGTN法语频道",
listOf("https://livefr.cgtn.com/1000f/prog_index.m3u8"), listOf(),
"国际", "国际",
"https://resources.yangshipin.cn/assets/oms/image/202306/a8d0046a47433d952bf6ed17062deb8bd2184ba9aec0f7781df6bf9487a3ffcf.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/a8d0046a47433d952bf6ed17062deb8bd2184ba9aec0f7781df6bf9487a3ffcf.png?imageMogr2/format/webp",
"600084704", "600084704",
@@ -901,7 +839,7 @@ object TVList {
0, 0,
"CGTN 俄语频道", "CGTN 俄语频道",
"CGTN俄语频道", "CGTN俄语频道",
listOf("http://liveru.cgtn.com/1000r/prog_index.m3u8"), listOf(),
"国际", "国际",
"https://resources.yangshipin.cn/assets/oms/image/202306/bf0a820893cbaf20dd0333e27042e1ef9c8806e5b602b6a8c95af399db0bc77a.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/bf0a820893cbaf20dd0333e27042e1ef9c8806e5b602b6a8c95af399db0bc77a.png?imageMogr2/format/webp",
"600084758", "600084758",
@@ -914,7 +852,7 @@ object TVList {
0, 0,
"CGTN 阿拉伯语频道", "CGTN 阿拉伯语频道",
"CGTN阿拉伯语频道", "CGTN阿拉伯语频道",
listOf("http://livear.cgtn.com/1000a/prog_index.m3u8"), listOf(),
"国际", "国际",
"https://resources.yangshipin.cn/assets/oms/image/202306/2e44e2aa3e7a1cedf07fd0ae59fe69e86a60a2632660a006e3e9e7397b2d107e.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202306/2e44e2aa3e7a1cedf07fd0ae59fe69e86a60a2632660a006e3e9e7397b2d107e.png?imageMogr2/format/webp",
"600084782", "600084782",
@@ -927,10 +865,7 @@ object TVList {
0, 0,
"CGTN 西班牙语频道", "CGTN 西班牙语频道",
"CGTN西班牙语频道", "CGTN西班牙语频道",
listOf( listOf(),
"http://livees.cgtn.com/500e/prog_index.m3u8",
"http://livees.cgtn.com/1000e/prog_index.m3u8"
),
"国际", "国际",
"https://resources.yangshipin.cn/assets/oms/image/202309/7c337e3dbe64402ec7e4678a619a4a6d95144e42f35161181ff78e143b7cf67a.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202309/7c337e3dbe64402ec7e4678a619a4a6d95144e42f35161181ff78e143b7cf67a.png?imageMogr2/format/webp",
"600084744", "600084744",
@@ -943,7 +878,7 @@ object TVList {
0, 0,
"CGTN 纪录频道", "CGTN 纪录频道",
"CGTN外语纪录频道", "CGTN外语纪录频道",
listOf("https://livedoc.cgtn.com/500d/prog_index.m3u8"), listOf(),
"国际", "国际",
"https://resources.yangshipin.cn/assets/oms/image/202309/74d3ac436a7e374879578de1d87a941fbf566d39d5632b027c5097891ed32bd5.png?imageMogr2/format/webp", "https://resources.yangshipin.cn/assets/oms/image/202309/74d3ac436a7e374879578de1d87a941fbf566d39d5632b027c5097891ed32bd5.png?imageMogr2/format/webp",
"600084781", "600084781",
@@ -0,0 +1,99 @@
package com.lizongying.mytv
import android.os.Bundle
import android.os.Handler
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.lizongying.mytv.Utils.getDateFormat
import com.lizongying.mytv.databinding.TimeBinding
class TimeFragment : Fragment() {
private var _binding: TimeBinding? = null
private val binding get() = _binding!!
private val handler = Handler()
private val delay: Long = 1000
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
Log.i(TAG, "onCreateView")
_binding = TimeBinding.inflate(inflater, container, false)
val activity = requireActivity()
val application = activity.applicationContext as MyApplication
val displayMetrics = application.getDisplayMetrics()
displayMetrics.density
var screenWidth = displayMetrics.widthPixels
var screenHeight = displayMetrics.heightPixels
if (screenHeight > screenWidth) {
screenWidth = displayMetrics.heightPixels
screenHeight = displayMetrics.widthPixels
}
val ratio = 16f / 9f
if (screenWidth / screenHeight > ratio) {
val x = ((screenWidth - screenHeight * ratio) / 2).toInt()
val originalLayoutParams = binding.time.layoutParams as ViewGroup.MarginLayoutParams
originalLayoutParams.rightMargin += x
binding.time.layoutParams = originalLayoutParams
}
if (screenWidth / screenHeight < ratio) {
val y = ((screenHeight - screenWidth / ratio) / 2).toInt()
val originalLayoutParams = binding.time.layoutParams as ViewGroup.MarginLayoutParams
originalLayoutParams.topMargin += y
binding.time.layoutParams = originalLayoutParams
}
(activity as MainActivity).fragmentReady("TimeFragment")
return binding.root
}
override fun onResume() {
super.onResume()
if (view?.visibility == View.VISIBLE) {
handler.removeCallbacks(showRunnable)
handler.postDelayed(showRunnable, 0)
}
}
override fun onPause() {
super.onPause()
handler.removeCallbacks(showRunnable)
}
private val showRunnable: Runnable = Runnable {
run {
binding.content.text = getDateFormat("HH:mm")
handler.postDelayed(showRunnable, delay)
}
}
fun show() {
view?.visibility = View.VISIBLE
handler.removeCallbacks(showRunnable)
handler.postDelayed(showRunnable, 0)
}
fun hide() {
view?.visibility = View.GONE
handler.removeCallbacks(showRunnable)
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
companion object {
private const val TAG = "TimeFragment"
}
}
@@ -77,5 +77,15 @@ object Utils {
).toInt() ).toInt()
} }
fun pxToDp(px: Float): Int {
val scale = Resources.getSystem().displayMetrics.density
return (px / scale).toInt()
}
fun pxToDp(px: Int): Int {
val scale = Resources.getSystem().displayMetrics.density
return (px / scale).toInt()
}
fun isTmallDevice() = Build.MANUFACTURER.equals("Tmall", ignoreCase = true) fun isTmallDevice() = Build.MANUFACTURER.equals("Tmall", ignoreCase = true)
} }
@@ -22,6 +22,8 @@ class ApiClient {
private val myUrl = "https://lyrics.run/" private val myUrl = "https://lyrics.run/"
private val protoUrl = "https://capi.yangshipin.cn/" private val protoUrl = "https://capi.yangshipin.cn/"
private val traceUrl = "https://btrace.yangshipin.cn/" private val traceUrl = "https://btrace.yangshipin.cn/"
private val trace2Url = "https://aatc-api.yangshipin.cn/"
private val trace3Url = "https://dtrace.ysp.cctv.cn/"
private val jceUrl = "https://jacc.ysp.cctv.cn/" private val jceUrl = "https://jacc.ysp.cctv.cn/"
private val fUrl = "https://m.fengshows.com/" private val fUrl = "https://m.fengshows.com/"
@@ -67,6 +69,22 @@ class ApiClient {
.build().create(YSPBtraceService::class.java) .build().create(YSPBtraceService::class.java)
} }
val yspBtraceService2: YSPBtraceService by lazy {
Retrofit.Builder()
.baseUrl(trace2Url)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build().create(YSPBtraceService::class.java)
}
val yspBtraceService3: YSPBtraceService by lazy {
Retrofit.Builder()
.baseUrl(trace3Url)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build().create(YSPBtraceService::class.java)
}
val yspJceService: YSPJceService by lazy { val yspJceService: YSPJceService by lazy {
Retrofit.Builder() Retrofit.Builder()
.baseUrl(jceUrl) .baseUrl(jceUrl)
@@ -0,0 +1,76 @@
package com.lizongying.mytv.api
data class KvcollectRequest(
val BossId: Int = 2727,
val Pwd: Int = 1424084450,
val cdn: String = "waibao",
val cmd: Int = 263,
val defn: String = "fhd",
val downspeed: Double = 10.0,
val durl: String = "", //
val errcode: String = "",
val fact1: String = "ysp_pc_live_b",
val firstreport: Int = 0,
val fplayerver: String = "100",
val ftime: String = "", //
val geturltime: Int = 0,
val guid: String = "", //
val hc_openid: String = "",
val hh_ua: String = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
val live_type: String = "",
val livepid: String = "", //
val login_type: String = "",
val open_id: String = "",
val openid: String = "",
val platform: String = "5910204",
val playno: String = "", //
val prd: Int = 60000,
val prog: String = "", //
val rand_str: String = "", //
val sRef: String = "",
val sUrl: String = "", //
val sdtfrom: String = "ysp_pc_01",
val seq: Int = 9, //
var signature: String = "",
val url: String = "", //
val viewid: String = "", //
val _dc: Double = 0.0,
)
data class KvcollectRequest2(
val BossId: Int = 2727,
val Pwd: Int = 1424084450,
val cdn: String = "waibao",
val cmd: Int = 263,
val defn: String = "fhd",
val downspeed: String = "10",
val durl: String = "", //
val errcode: String = "",
val fact1: String = "ysp_pc_live_b",
val firstreport: Int = 0,
val fplayerver: String = "100",
val ftime: String = "", //
val geturltime: Int = 0,
val guid: String = "", //
val hc_openid: String = "",
val hh_ua: String = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
val live_type: String = "",
val livepid: String = "", //
val login_type: String = "",
val open_id: String = "",
val openid: String = "",
val platform: String = "5910204",
val playno: String = "", //
val prd: Int = 60000,
val prog: String = "", //
val rand_str: String = "", //
val sRef: String = "",
val sUrl: String = "", //
val sdtfrom: String = "ysp_pc_01",
val seq: Int = 9, //
var signature: String = "",
val url: String = "", //
val viewid: String = "", //
val _dc: Double = 0.0,
)
@@ -141,4 +141,9 @@ object YSP {
val hashedData = encryptor.hash2(e) ?: return "" val hashedData = encryptor.hash2(e) ?: return ""
return hashedData.let { it -> it.joinToString("") { "%02x".format(it) } } return hashedData.let { it -> it.joinToString("") { "%02x".format(it) } }
} }
fun getAuthSignature(e: String): String {
val hashedData = encryptor.hash2(e.toByteArray()) ?: return ""
return hashedData.let { it -> it.joinToString("") { "%02x".format(it) } }
}
} }
@@ -21,18 +21,6 @@ interface YSPApiService {
@Body request: LiveInfoRequest, @Body request: LiveInfoRequest,
): Call<LiveInfo> ): Call<LiveInfo>
@POST("v1/player/get_live_info")
@Headers(
"content-type: application/json;charset=UTF-8",
"referer: https://www.yangshipin.cn/",
"yspappid: 519748109",
"user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
)
fun getLiveInfoV2(
@Header("cookie") cookie: String,
@Body request: LiveInfoRequest,
): Call<LiveInfo>
@POST("v1/player/auth") @POST("v1/player/auth")
@Headers( @Headers(
"content-type: application/x-www-form-urlencoded;charset=UTF-8", "content-type: application/x-www-form-urlencoded;charset=UTF-8",
@@ -1,11 +1,11 @@
package com.lizongying.mytv.api package com.lizongying.mytv.api
import retrofit2.Call import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.Field import retrofit2.http.Field
import retrofit2.http.FormUrlEncoded import retrofit2.http.FormUrlEncoded
import retrofit2.http.Headers import retrofit2.http.Headers
import retrofit2.http.POST import retrofit2.http.POST
import retrofit2.http.Path
import retrofit2.http.Query import retrofit2.http.Query
@@ -68,4 +68,58 @@ interface YSPBtraceService {
@Field("c_guid") c_guid: String = "", @Field("c_guid") c_guid: String = "",
@Field("c_vuid") c_vuid: String = "-", @Field("c_vuid") c_vuid: String = "-",
): Call<Void> ): Call<Void>
@POST("kvcollect")
@Headers(
"content-type: application/json",
"referer: https://www.yangshipin.cn/",
"Cookie: guid=1; versionName=99.99.99; versionCode=999999; vplatform=109; platformVersion=Chrome; deviceModel=123",
"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
)
fun kvcollect2(
@Body request: KvcollectRequest,
): Call<Void>
@FormUrlEncoded
@POST("kvcollect")
@Headers(
"content-type: application/x-www-form-urlencoded",
"referer: https://www.yangshipin.cn/",
)
fun kvcollect3(
@Field("BossId") BossId: String = "9141",
@Field("Pwd") Pwd: String = "1137850982",
@Field("prog") prog: String = "", //
@Field("playno") playno: String = "", //
@Field("guid") guid: String = "", //
@Field("hh_ua") hh_ua: String = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
@Field("cdn") cdn: String = "waibao",
@Field("sdtfrom") sdtfrom: String = "ysp_pc_01",
@Field("prd") prd: String = "60000",
@Field("platform") platform: String = "5910204",
@Field("errcode") errcode: String = "-",
@Field("durl") durl: String = "", //
@Field("firstreport") firstreport: String = "-",
@Field("sUrl") sUrl: String = "", //
@Field("sRef") sRef: String = "-",
@Field("fplayerver") fplayerver: String = "100",
@Field("livepid") livepid: String = "",
@Field("viewid") viewid: String = "",
@Field("seq") seq: String = "",
@Field("cmd") cmd: String = "263",
@Field("login_type") login_type: String = "-",
@Field("geturltime") geturltime: String = "-",
@Field("downspeed") downspeed: String = "10",
@Field("hc_openid") hc_openid: String = "-",
@Field("open_id") open_id: String = "-",
@Field("defn") defn: String = "fhd",
@Field("fact1") fact1: String = "ysp_pc_live_b",
@Field("openid") openid: String = "-",
@Field("_dc") _dc: String = "",
@Field("live_type") live_type: String = "-",
@Field("ftime") ftime: String = "",
@Field("url") url: String = "",
@Field("rand_str") rand_str: String = "", //
@Field("signature") signature: String = "",
): Call<Void>
} }
+4 -4
View File
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/channel_fragment" android:id="@+id/channel_fragment"
android:layout_width="80dp" android:layout_width="90dp"
android:layout_height="80dp" android:layout_height="60dp"
android:layout_gravity="end|top" android:layout_gravity="end|top"
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
android:layout_marginEnd="50dp"> android:layout_marginEnd="170dp">
<TextView <TextView
android:id="@+id/channel_content" android:id="@+id/channel_content"
@@ -15,5 +15,5 @@
android:layout_marginTop="0dp" android:layout_marginTop="0dp"
android:textColor="#FFEEEEEE" android:textColor="#FFEEEEEE"
android:textStyle="bold" android:textStyle="bold"
android:textSize="50sp" /> android:textSize="40sp" />
</FrameLayout> </FrameLayout>
+16 -4
View File
@@ -51,23 +51,35 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
</LinearLayout> </LinearLayout>
<Button
android:id="@+id/exit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:text="@string/exit"
/>
<Switch <Switch
android:id="@+id/switch_channel_reversal" android:id="@+id/switch_channel_reversal"
android:text="@string/title_channel_reversal" android:text="@string/title_channel_reversal"
android:layout_marginTop="10dp" android:layout_marginTop="5dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<Switch <Switch
android:id="@+id/switch_channel_num" android:id="@+id/switch_channel_num"
android:text="@string/title_channel_num" android:text="@string/title_channel_num"
android:layout_marginTop="10dp" android:layout_marginTop="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Switch
android:id="@+id/switch_time"
android:text="@string/title_time"
android:layout_marginTop="5dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<Switch <Switch
android:id="@+id/switch_boot_startup" android:id="@+id/switch_boot_startup"
android:text="@string/title_boot_startup" android:text="@string/title_boot_startup"
android:layout_marginTop="10dp" android:layout_marginTop="5dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
</LinearLayout> </LinearLayout>
+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/time"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_gravity="end|top"
android:layout_marginTop="25dp"
android:layout_marginEnd="50dp">
<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginTop="0dp"
android:textColor="#FFEEEEEE"
android:textStyle="bold"
android:textSize="32sp" />
</FrameLayout>
+3 -1
View File
@@ -1,8 +1,10 @@
<resources> <resources>
<string name="app_name">我的电视</string> <string name="app_name">我的电视</string>
<string name="title_channel_reversal">换台反转</string> <string name="title_channel_reversal">换台反转</string>
<string name="title_channel_num">数字选台</string> <string name="title_channel_num">换台时显示频道号</string>
<string name="check_version">检查更新</string> <string name="check_version">检查更新</string>
<string name="title_boot_startup">开机自启</string> <string name="title_boot_startup">开机自启</string>
<string name="dismiss_error">好的</string> <string name="dismiss_error">好的</string>
<string name="title_time">显示时间</string>
<string name="exit">退出</string>
</resources> </resources>
+20
View File
@@ -0,0 +1,20 @@
#!/bin/bash
in_changelog=false
while IFS= read -r line; do
if [[ "$line" == "## "* ]]; then
continue
fi
if [[ $in_changelog == false ]] && [[ "$line" == "### "* ]]; then
in_changelog=true
continue
fi
if [[ $in_changelog == true ]] && [[ "$line" == "### "* ]]; then
break
fi
echo "$line"
done < HISTORY.md
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

After

Width:  |  Height:  |  Size: 0 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 0 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 0 B

+1
View File
@@ -0,0 +1 @@
{"version_code": 33619968, "version_name": "v2.1.0"}