Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

接口偏好设置Web和App是否可以相互兼容 #152

Open
Vanco opened this issue Oct 6, 2024 · 11 comments
Open

接口偏好设置Web和App是否可以相互兼容 #152

Vanco opened this issue Oct 6, 2024 · 11 comments
Labels
优化 需要改善的功能

Comments

@Vanco
Copy link

Vanco commented Oct 6, 2024

Bug 描述

是否不要设置Web或App,程序内部兼容。如果Web不能播放,能不能自动试试App。这两个并不是完全互斥的。举一个实例说话:当观看《流浪地球2》时,如果偏好设置为Web,不能正确加载URL。但当选择为App时或以正常加载并播放。但是,如果选择了App,有一些原来或能播放的视频,又不能正常播放了。还得改回Web。

复现问题的步骤

  1. 将偏好设置为Web。
  2. 选择播放《流浪地球2》。
  3. 无法加载URL,报找到杜比的音轨的错误。
播放器正在抽风
_(3]<)_
错误信息: Illegal inpu : Fields[baseUrl, mimeType, frameRate] are required for type with serial name 'dev.aaa1115910.biliapi.http.entity.video.DashData', but they were missing at path: S.result.dash.dolby.audio[0]
  1. 更改偏好设置为App。
  2. 可以正常播放《流浪地球2》。
  3. 选择播放另一个视频:《梦想改造家》,无法显示详情页面。显示错误。
Illegal input : Field 'uri' is required for type with serial name 'dev.aaa1115910.biliapi.http.entity.season.AppSeasonData.Style', but it was missing at path: S.data.styles[O]
  1. 将偏好由App改为Web,重试打开《梦想改造家》,可正常显示页面。

预期行为

期望结果:两种方式如下

  1. 不用设置接口偏好,程序内部默认使用Web,如果遇到异常,主动尝试App接口,如果两个都不行,才提示用户错误。
  2. 保持现有接口偏好设置,程序内部先使用用户选定的偏好接口,如果遇到异常,主动尝试另一接口。如果两个接口都不成功才提示用户错误。

截图

No response

请确认已更新到以下所示的最新版本

我正在使用旧版本

当前版本号

0.2.8.r664.xxx

Android 版本

Android 11

设备厂商及型号

No response

遇到问题的视频 avid 或 bvid

No response

相关日志

No response

附加信息

No response

Copy link

github-actions bot commented Oct 6, 2024

请先尝试使用最新版本,如果问题依然存在再提交 issue

@github-actions github-actions bot closed this as completed Oct 6, 2024
@Vanco
Copy link
Author

Vanco commented Oct 6, 2024

请先尝试使用最新版本,如果问题依然存在再提交 issue

最新版本无显显示画面,只有声音。

@aaa1115910
Copy link
Owner

截屏2024-10-06 19 05 04
看着写的挺细心的,然其实并不细心(自动关闭默认选项的 issue)

@aaa1115910 aaa1115910 reopened this Oct 6, 2024
@aaa1115910 aaa1115910 added the 优化 需要改善的功能 label Oct 6, 2024
@aaa1115910
Copy link
Owner

我也曾想过整一个混合起来用的选项供用户选择,但部分接口App端和Web端返回的结果内容差异过大就没做

@aaa1115910
Copy link
Owner

请先尝试使用最新版本,如果问题依然存在再提交 issue

最新版本无显显示画面,只有声音。

alpha版?

@Vanco
Copy link
Author

Vanco commented Oct 6, 2024

请先尝试使用最新版本,如果问题依然存在再提交 issue

最新版本无显显示画面,只有声音。

alpha版?

是的alpha。最近版本就是这样,播放时不显示视频画面,好象有人已提Bug了。

@Vanco
Copy link
Author

Vanco commented Oct 6, 2024

我也曾想过整一个混合起来用的选项供用户选择,但部分接口App端和Web端返回的结果内容差异过大就没做

象你说的,接口差别很大,融合成一个难度大,就保持两个接口。但是不是可以在失败的时候,尝试一下另一个接口,象我上面遇到的情况,换一个接口就正常了。所以你还是可以保留两套接口,程序做一个兼容逻辑,调用A接口失败了,就试一下B接口。反之亦然。

@Vanco
Copy link
Author

Vanco commented Nov 21, 2024

【我的方案】针对流浪地球2播放报错误的问题,我临时方案如下:
原文件VideoPlayRepository.kt的方法suspend fun getPgcPlayData中,ApiType.Web ->分支,原来调用

val playUrlData = if (enableProxy) {
    BiliHttpProxyApi.getPgcVideoPlayUrl(...)
} else {
    // 出错的地方,这个接口返回的流浪地球2的信息,反序列化JSON会报上面的错误
    BiliHttpApi.getPgcVideoPlayUrl(...)
}.getResponseData()

我加上了一个try {} cach (), 就可以工作了。

val playUrlData = try {
    if (enableProxy) {
        BiliHttpProxyApi.getPgcVideoPlayUrl(...)
    } else {
        BiliHttpApi.getPgcVideoPlayUrl(...)
    }.getResponseData()
} cache(_ : Exception) {
    if (enableProxy) {
        BiliHttpProxyApi.getPgcVideoPlayUrl(...)
    } else {
        // 这里改为调用视频接口,就不报错了。
        BiliHttpApi.getVideoPlayUrl(...)
    }.getResponseData()
}

我这样改比较武断,给你提个思路,希望你有更完美的方案。

@aaa1115910
Copy link
Owner

【我的方案】针对流浪地球2播放报错误的问题,我临时方案如下: 原文件VideoPlayRepository.kt的方法suspend fun getPgcPlayData中,ApiType.Web ->分支,原来调用

val playUrlData = if (enableProxy) {
    BiliHttpProxyApi.getPgcVideoPlayUrl(...)
} else {
    // 出错的地方,这个接口返回的流浪地球2的信息,反序列化JSON会报上面的错误
    BiliHttpApi.getPgcVideoPlayUrl(...)
}.getResponseData()

我加上了一个try {} cach (), 就可以工作了。

val playUrlData = try {
    if (enableProxy) {
        BiliHttpProxyApi.getPgcVideoPlayUrl(...)
    } else {
        BiliHttpApi.getPgcVideoPlayUrl(...)
    }.getResponseData()
} cache(_ : Exception) {
    if (enableProxy) {
        BiliHttpProxyApi.getPgcVideoPlayUrl(...)
    } else {
        // 这里改为调用视频接口,就不报错了。
        BiliHttpApi.getVideoPlayUrl(...)
    }.getResponseData()
}

我这样改比较武断,给你提个思路,希望你有更完美的方案。

我记得好像我最开始写的时候测试出普通视频接口不能获取 pgc 视频,刚刚随便试了一下海绵宝宝中文版第一集(随便点的视频)就无法使用普通接口获取。

我试过直接在 VideoPlayRepository 处改,web 接口错误就调用 app 接口,但后来发现因为不同接口获取到的播放地址需要不同的 useragent 来播放,那这就改的多了。而且这种情况如果一个接口失效了我也没办法第一时间发现,挺头疼的。

现在我就想的是可以在播放页面失败了显示一个使用另一接口重试的按钮,但这样也许就只对播放器有效差点意思。。。。

@Vanco
Copy link
Author

Vanco commented Nov 21, 2024

其实还在ApiType.Web ->分中,不会影响后面的播放逻辑,只是在正常逻辑报错后,在Cach里面试了一次调用另一接口。不过我只是瞎猜的,各种API的特点和限制,你比我清楚。
可能流浪地球2是个特列

@aaa1115910
Copy link
Owner

原本把所有接口都改成了失败后自动尝试另一接口,但突然意识到那很多接口的app/web不能混用,因为请求参数可能完全不同,难搞🫠

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
优化 需要改善的功能
Projects
None yet
Development

No branches or pull requests

2 participants