Skip to content

Commit d941c56

Browse files
TinyHaiyujincheng08
authored andcommitted
fix: download
1 parent 225d831 commit d941c56

File tree

3 files changed

+81
-4
lines changed

3 files changed

+81
-4
lines changed

app/src/main/java/me/iacn/biliroaming/BiliBiliPackage.kt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ class BiliBiliPackage constructor(private val mClassLoader: ClassLoader, mContex
180180
val fastjsonFieldAnnotation by Weak { "com.alibaba.fastjson.annotation.JSONField" from mClassLoader }
181181
val gsonFieldAnnotation by Weak { "com.google.gson.annotations.SerializedName" from mClassLoader }
182182
val pegasusParserClass by Weak { mHookInfo.pegasusParser from mClassLoader }
183+
val resolveClientCompanionClass by Weak { mHookInfo.resolveClientCompanion.class_ from mClassLoader }
184+
val videoDownloadEntryClass by Weak { "com.bilibili.videodownloader.model.VideoDownloadEntry" from mClassLoader }
183185

184186
// for v8.17.0+
185187
val useNewMossFunc = instance.viewMossClass?.declaredMethods?.any {
@@ -359,6 +361,10 @@ class BiliBiliPackage constructor(private val mClassLoader: ClassLoader, mContex
359361

360362
fun getDataSPMethod() = mHookInfo.dataSP.get.orNull
361363

364+
fun buildCommonResolverParamsMethod() =
365+
mHookInfo.resolveClientCompanion.buildCommonResolverParams.orNull
366+
367+
fun setExtraContentMethod() = mHookInfo.gCommonResolverParams.setExtraContent.orNull
362368

363369
private fun readHookInfo(context: Context): Configs.HookInfo {
364370
try {
@@ -2336,6 +2342,46 @@ class BiliBiliPackage constructor(private val mClassLoader: ClassLoader, mContex
23362342
?: return@class_
23372343
name = getPegasusParser.declaringClass.name
23382344
}
2345+
resolveClientCompanion = resolveClientCompanion {
2346+
val resolveClientClass = dexHelper.findMethodUsingString(
2347+
"Invalid segment id: %s, segment list size:%s",
2348+
false,
2349+
-1,
2350+
-1,
2351+
null,
2352+
-1,
2353+
null,
2354+
null,
2355+
null,
2356+
true
2357+
).asSequence().firstNotNullOfOrNull {
2358+
dexHelper.decodeMethodIndex(it)?.declaringClass
2359+
} ?: return@resolveClientCompanion
2360+
val resolveClientCompanionClass = "${resolveClientClass.name}\$a".from(classloader)
2361+
?: return@resolveClientCompanion
2362+
val paramsClass =
2363+
"com.bilibili.app.gemini.base.player.GeminiCommonResolverParams".from(
2364+
classloader
2365+
)
2366+
val videoDownloadEntryClass =
2367+
"com.bilibili.videodownloader.model.VideoDownloadEntry".from(classloader)
2368+
val buildParamsMethod = resolveClientCompanionClass.declaredMethods.firstOrNull {
2369+
it.returnType == paramsClass && it.parameterCount == 1 && it.parameterTypes[0] == videoDownloadEntryClass
2370+
} ?: return@resolveClientCompanion
2371+
class_ = class_ { name = resolveClientCompanionClass.name }
2372+
buildCommonResolverParams = method { name = buildParamsMethod.name }
2373+
}
2374+
gCommonResolverParams = gCommonResolverParams {
2375+
val commonResolverParamsClass =
2376+
"com.bilibili.app.gemini.base.player.GeminiCommonResolverParams".from(
2377+
classloader
2378+
) ?: return@gCommonResolverParams
2379+
val setExtraContentMethod = commonResolverParamsClass.declaredMethods?.firstOrNull {
2380+
it.returnType == Void.TYPE && it.parameterCount == 1 && it.parameterTypes[0] == Map::class.java
2381+
} ?: return@gCommonResolverParams
2382+
class_ = class_ { name = commonResolverParamsClass.name }
2383+
setExtraContent = method { name = setExtraContentMethod.name }
2384+
}
23392385
dexHelper.close()
23402386
}
23412387

app/src/main/java/me/iacn/biliroaming/hook/BangumiPlayUrlHook.kt

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,24 @@ class BangumiPlayUrlHook(classLoader: ClassLoader) : BaseHook(classLoader) {
269269
}
270270
}
271271
}
272+
273+
// 修复下载时提示获取剧集信息失败
274+
instance.resolveClientCompanionClass?.hookAfterMethod(
275+
instance.buildCommonResolverParamsMethod(),
276+
instance.videoDownloadEntryClass
277+
) { param ->
278+
val entry = param.args[0].callMethodAs<JSONObject?>("toJsonObject")
279+
val seasonId = entry?.optString("season_id")
280+
val epId = entry?.optJSONObject("ep")?.optString("episode_id")
281+
val extraMap = buildMap {
282+
seasonId?.let { put("season_id", it) }
283+
epId?.let { put("ep_id", it) }
284+
}.ifEmpty {
285+
return@hookAfterMethod
286+
}
287+
param.result.callMethod(instance.setExtraContentMethod(), extraMap)
288+
}
289+
272290
instance.playerMossClass?.run {
273291
var isDownload = false
274292
hookBeforeMethod(
@@ -354,10 +372,11 @@ class BangumiPlayUrlHook(classLoader: ClassLoader) : BaseHook(classLoader) {
354372
}
355373
?: throw CustomServerException(mapOf("未知错误" to "请检查哔哩漫游设置中解析服务器设置。"))
356374
} catch (e: CustomServerException) {
357-
param.result = showPlayerErrorUnite(
358-
response, supplement,
359-
"请求解析服务器发生错误", e.message, true
360-
)
375+
// v8.48.0+ 打开缓存弹窗导致应用崩溃
376+
// param.result = showPlayerErrorUnite(
377+
// response, supplement,
378+
// "请求解析服务器发生错误", e.message, true
379+
// )
361380
Log.toast("请求解析服务器发生错误: ${e.message}", alsoLog = true)
362381
}
363382
} else if (isDownload) {

app/src/main/proto/me/iacn/biliroaming/configs.proto

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,16 @@ message DataSP {
320320
optional Method get = 2;
321321
}
322322

323+
message ResolveClientCompanion {
324+
optional Class class = 1;
325+
optional Method buildCommonResolverParams = 2;
326+
}
327+
328+
message GCommonResolverParams {
329+
optional Class class = 1;
330+
optional Method setExtraContent = 2;
331+
}
332+
323333
message HookInfo {
324334
int64 last_update_time = 1;
325335
optional MapIds map_ids = 2;
@@ -389,4 +399,6 @@ message HookInfo {
389399
optional PreBuiltConfig preBuiltConfig = 99;
390400
optional DataSP dataSP = 100;
391401
optional Class pegasus_parser = 101;
402+
optional ResolveClientCompanion resolveClientCompanion = 102;
403+
optional GCommonResolverParams gCommonResolverParams = 103;
392404
}

0 commit comments

Comments
 (0)