Compare commits

...
8 Commits
Author SHA1 Message Date
Li ZongYing acff1d41fc x86 2024-06-20 14:20:22 +08:00
Li ZongYing ab71075c85 x86 2024-06-20 13:57:40 +08:00
Li ZongYing 5d4353249f fix ysp 2024-06-20 13:43:14 +08:00
Li ZongYing a8944e75b1 ysp 2024-06-08 11:23:31 +08:00
Li ZongYing d1eae8947e ysp 2024-06-08 10:50:22 +08:00
Li ZongYing fccd64c07b ysp 2024-06-08 10:49:10 +08:00
Li ZongYing eac355a1c1 fix black screen 2024-06-07 17:49:49 +08:00
Li ZongYing 6c6736fd0a gradle lib version 2024-06-07 17:22:42 +08:00
16 changed files with 223 additions and 97 deletions
+9 -1
View File
@@ -1,9 +1,17 @@
## 更新日誌
### v2.1.2
### v2.1.8
* 支持x86設備
### v2.1.7
*
### v2.1.4
* 解決切換頻道時黑屏問題
### v2.1.1
* 平衡聲音
+22 -69
View File
@@ -26,8 +26,8 @@ android {
cmake {
arguments "-DIS_SO_BUILD=${project.hasProperty('IS_SO_BUILD') ? project.IS_SO_BUILD : true}"
// abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
abiFilters "armeabi-v7a", "arm64-v8a"
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
// abiFilters "armeabi-v7a", "arm64-v8a"
}
}
@@ -37,7 +37,8 @@ android {
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your app.
abiFilters "armeabi-v7a", "arm64-v8a"
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
// abiFilters "armeabi-v7a", "arm64-v8a"
}
multiDexEnabled true
}
@@ -98,71 +99,23 @@ static def VersionName() {
}
}
def gson_version = "2.10.1"
def failureaccess_version = "1.0.2"
def guava_version = "33.2.1-android"
dependencies {
// minSdk17
def media3_version = "1.2.1"
implementation "androidx.media3:media3-ui:$media3_version"
// For media playback using ExoPlayer
implementation("com.google.guava:failureaccess:$failureaccess_version")
implementation("com.google.guava:guava:$guava_version")
implementation("androidx.media3:media3-common:$media3_version") {
exclude group: 'com.google.guava', module: 'guava'
exclude group: 'com.google.guava', module: 'failureaccess'
}
implementation("androidx.media3:media3-exoplayer:$media3_version")
// For HLS playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
// 21:2.9.0 17:2.6.4
def retrofit2_version = "2.6.4"
implementation 'com.google.protobuf:protobuf-kotlin:3.25.1'
// Gson 2.10.1 and older: API level 19
implementation("com.google.code.gson:gson:$gson_version")
implementation("com.squareup.retrofit2:converter-gson:$retrofit2_version") {
exclude group: 'com.google.code.gson', module: 'gson'
}
implementation "com.squareup.retrofit2:converter-protobuf:$retrofit2_version"
implementation "com.squareup.retrofit2:retrofit:$retrofit2_version"
implementation 'com.github.bumptech.glide:glide:4.11.0'
implementation("androidx.work:work-runtime-ktx:2.9.0")
implementation 'androidx.core:core-ktx:1.11.0-beta02'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.leanback:leanback:1.2.0-alpha02'
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.2"
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2"
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0-RC")
implementation 'javax.annotation:javax.annotation-api:1.3.2'
}
configurations.configureEach {
resolutionStrategy {
force("com.google.code.gson:gson:$gson_version")
force "com.google.guava:failureaccess:$failureaccess_version"
force "com.google.guava:guava:$guava_version"
eachDependency { details ->
if (details.requested.group == 'com.google.code.gson') {
details.useVersion "$gson_version"
}
if (details.requested.group == 'com.google.guava' && details.requested.name == 'failureaccess') {
details.useVersion "$failureaccess_version"
}
if (details.requested.group == 'com.google.guava' && details.requested.name == 'guava') {
details.useVersion "$guava_version"
}
}
}
implementation(libs.media3.ui)
implementation(libs.media3.exoplayer)
implementation(libs.media3.exoplayer.hls)
implementation(libs.protobuf.kotlin)
implementation(libs.gson)
implementation(libs.converter.gson)
implementation(libs.converter.protobuf)
implementation(libs.retrofit)
implementation(libs.glide)
implementation(libs.work.runtime.ktx)
implementation(libs.core.ktx)
implementation(libs.multidex)
implementation(libs.leanback)
implementation(libs.lifecycle.runtime.ktx)
implementation(libs.constraintlayout)
implementation(libs.serialization.json)
implementation(libs.coroutines.android)
implementation(libs.javax.annotation.api)
}
+1 -7
View File
@@ -18,10 +18,4 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-keep class com.google.gson.** { *; }
-dontwarn com.google.gson.**
-keep class com.google.guava.** { *; }
-dontwarn com.google.guava.**
#-renamesourcefileattribute SourceFile
+1
View File
@@ -11,6 +11,7 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.READ_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.REQUEST_INSTALL_PACKAGES" />
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
@@ -2,6 +2,7 @@ package com.lizongying.mytv
import android.content.res.Resources
import android.os.Build
import android.util.Log
import android.util.TypedValue
import com.google.gson.Gson
import com.lizongying.mytv.api.TimeResponse
@@ -18,6 +19,10 @@ import java.util.Locale
object Utils {
private var between: Long = 0
private var a: String = ""
var b: String = ""
private var c: String = ""
private var listener: Request.RequestListener? = null
fun getDateFormat(format: String): String {
@@ -45,6 +50,31 @@ object Utils {
println("Failed to retrieve timestamp from server: ${e.message}")
}
var x = ""
try {
x = getNothing()
} catch (e: Exception) {
x = ""
println("a ${e.message}")
}
if (x != "") {
try {
x = getNothing2(x)
} catch (e: Exception) {
x = ""
println("b ${e.message}")
}
}
// if (x != "") {
// try {
// getNothing3(x)
// } catch (e: Exception) {
// println("b ${e.message}")
// }
// }
withContext(Dispatchers.Main) {
listener?.onRequestFinished(null)
}
@@ -88,6 +118,115 @@ object Utils {
}
}
private val regex = Regex("""chunk-vendors\.([^.]+)\.js""")
private suspend fun getNothing(): String {
return withContext(Dispatchers.IO) {
val client = okhttp3.OkHttpClient.Builder()
.addInterceptor(RetryInterceptor(3))
.build()
val request = okhttp3.Request.Builder()
.url("https://www.yangshipin.cn")
.build()
try {
client.newCall(request).execute().use { response ->
if (!response.isSuccessful) throw IOException("Unexpected code $response")
val string = response.body()?.string()
val matchResult = string?.let { regex.find(it) }
var x = ""
if (matchResult != null) {
x = matchResult.groupValues[1]
}
x
}
} catch (e: IOException) {
throw IOException("Error during network request", e)
}
}
}
private val regex2 = Regex(""""ysp_tx"[^:]+:"([^"]+)[^:]+:"([^"]+)""")
private val regex3 = Regex(""""(https[^"]+wasm([^"]+))""")
private suspend fun getNothing2(x: String): String {
return withContext(Dispatchers.IO) {
val client = okhttp3.OkHttpClient.Builder()
.addInterceptor(RetryInterceptor(3))
.build()
val request = okhttp3.Request.Builder()
.url("https://www.yangshipin.cn/js/chunk-vendors.$x.js")
.build()
try {
client.newCall(request).execute().use { response ->
if (!response.isSuccessful) throw IOException("Unexpected code $response")
val string = response.body()?.string()
val matches = string?.let { regex2.findAll(it) }
var matchResult = matches?.lastOrNull()
if (matchResult != null) {
val (aa, bb) = matchResult.destructured
a = aa
b = bb
}
matchResult = string?.let { regex3.find(it) }
if (matchResult != null) {
val (cc) = matchResult.destructured
c = cc
Log.i("", "ccccc $c")
}
c
}
} catch (e: IOException) {
throw IOException("Error during network request", e)
}
}
}
private suspend fun getNothing3(x: String): String {
return withContext(Dispatchers.IO) {
val client = okhttp3.OkHttpClient.Builder()
.addInterceptor(RetryInterceptor(3))
.build()
val request = okhttp3.Request.Builder()
.url("https://www.yangshipin.cn/js/chunk-vendors.$x.js")
.build()
try {
client.newCall(request).execute().use { response ->
if (!response.isSuccessful) throw IOException("Unexpected code $response")
val string = response.body()?.string()
val matches = string?.let { regex2.findAll(it) }
var matchResult = matches?.lastOrNull()
if (matchResult != null) {
val (aa, bb) = matchResult.destructured
a = aa
b = bb
}
matchResult = string?.let { regex3.find(it) }
if (matchResult != null) {
val (cc) = matchResult.destructured
c = cc
}
c
}
} catch (e: IOException) {
throw IOException("Error during network request", e)
}
}
}
fun dpToPx(dp: Float): Int {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, dp, Resources.getSystem().displayMetrics
@@ -13,6 +13,8 @@ class Encryptor {
external fun hash2(data: ByteArray): ByteArray?
external fun hash3(data: ByteArray): ByteArray?
companion object {
init {
System.loadLibrary("native")
@@ -3,6 +3,7 @@ package com.lizongying.mytv.api
import android.content.Context
import android.util.Log
import com.lizongying.mytv.SP
import com.lizongying.mytv.Utils
import com.lizongying.mytv.Utils.getDateTimestamp
import com.lizongying.mytv.models.TVViewModel
import java.security.MessageDigest
@@ -182,13 +183,13 @@ object YSP {
private fun getAuthSignature(): String {
val e =
"appid=${appid}&guid=${guid}&pid=${livepid}&rand_str=${randStr}".toByteArray()
val hashedData = encryptor.hash2(e) ?: return ""
"appid=${appid}&guid=${guid}&pid=${livepid}&rand_str=${randStr}${Utils.b}".toByteArray()
val hashedData = encryptor.hash3(e) ?: return ""
return hashedData.let { it -> it.joinToString("") { "%02x".format(it) } }
}
fun getAuthSignature(e: String): String {
val hashedData = encryptor.hash2(e.toByteArray()) ?: return ""
val hashedData = encryptor.hash3("$e${Utils.b}".toByteArray()) ?: return ""
return hashedData.let { it -> it.joinToString("") { "%02x".format(it) } }
}
}
@@ -334,21 +334,8 @@ object Request {
val liveInfo = response.body()
if (liveInfo?.data?.playurl != null) {
val chanll = liveInfo.data.chanll
val decodedBytes = Base64.decode(
chanll.substring(9, chanll.length - 3),
Base64.DEFAULT
)
val decodedString = String(decodedBytes)
val matchResult = regex.find(decodedString)
if (matchResult != null) {
val (key, iv) = matchResult.destructured
val keyBytes = Base64.decode(key, Base64.DEFAULT)
val ivBytes = Base64.decode(iv, Base64.DEFAULT)
val url = liveInfo.data.playurl + "&revoi=" + encryptTripleDES(
keyBytes + byteArrayOf(0, 0, 0, 0, 0, 0, 0, 0),
ivBytes
).uppercase() + liveInfo.data.extended_param
if (liveInfo.data.extended_param != null) {
val url = liveInfo.data.playurl + "&revoi=" + liveInfo.data.extended_param
Log.d(TAG, "$title url $url")
tvModel.addVideoUrl(url)
tvModel.allReady()
+1
View File
@@ -11,6 +11,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
app:shutter_background_color="@android:color/transparent"
app:resize_mode="fill"
app:use_controller="false" />
</FrameLayout>
+40
View File
@@ -0,0 +1,40 @@
[versions]
media3 = "1.2.1" # minSdk17
gson = "2.10.1" # 2.10.1 and older: API level 19
failureaccess = "1.0.2"
guava = "33.2.1-android"
retrofit = "2.6.4" # 21:2.9.0 17:2.6.4
protobuf = "3.25.1"
glide = "4.11.0"
work = "2.9.0"
core_ktx = "1.11.0-beta02"
multidex = "2.0.1"
leanback = "1.2.0-alpha02"
lifecycle = "2.6.2"
constraintlayout = "2.1.4"
serialization = "1.6.2"
coroutines = "1.8.0-RC"
javax_annotation = "1.3.2"
[libraries]
media3-ui = { module = "androidx.media3:media3-ui", version.ref = "media3" }
media3-common = { module = "androidx.media3:media3-common", version.ref = "media3" }
media3-exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3" }
media3-exoplayer-hls = { module = "androidx.media3:media3-exoplayer-hls", version.ref = "media3" }
gson = { module = "com.google.code.gson:gson", version.ref = "gson" }
failureaccess = { module = "com.google.guava:failureaccess", version.ref = "failureaccess" }
guava = { module = "com.google.guava:guava", version.ref = "guava" }
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" }
converter-protobuf = { module = "com.squareup.retrofit2:converter-protobuf", version.ref = "retrofit" }
protobuf-kotlin = { module = "com.google.protobuf:protobuf-kotlin", version.ref = "protobuf" }
glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" }
work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "work" }
core-ktx = { module = "androidx.core:core-ktx", version.ref = "core_ktx" }
multidex = { module = "androidx.multidex:multidex", version.ref = "multidex" }
leanback = { module = "androidx.leanback:leanback", version.ref = "leanback" }
lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle" }
constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" }
serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }
coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
javax-annotation-api = { module = "javax.annotation:javax.annotation-api", version.ref = "javax_annotation" }
+1 -1
View File
@@ -1,6 +1,6 @@
#Fri Dec 01 13:53:24 HKT 2023
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-rc-1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
+1 -1
View File
@@ -1 +1 @@
{"version_code": 33620480, "version_name": "v2.1.2"}
{"version_code": 33622016, "version_name": "v2.1.8"}