xfangfang / wiliwili

第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上
https://xfangfang.github.io/wiliwili
GNU General Public License v3.0
3.03k stars 146 forks source link

fix live crash #232

Closed lanytcc closed 8 months ago

lanytcc commented 8 months ago

今天上来跑就崩溃,发现了个惊天大bug😂,居然这么长时间都能跑

xfangfang commented 8 months ago

竟然还有这个问题,我倒是没遇到过,可能我这边网络速度不行 : )

LiveActivity::LiveActivity(const bilibili::LiveVideoResult& live) 这个构造函数现在完全没有在使用了,其实删掉也是可以的。或者 可以把 LiveDanmaku::instance().setonMessage 还有顺便把那两个 GA一起都写到 setCommonData 里面去。

我有两个小建议:

  1. LiveDanmaku::connect 内部的逻辑变成先调用 get_live_s 异步获取token,然后再开始连接好不好。这样避免了网络质量不好的设备点开直播间时卡顿(比如 psv)。
  2. mongoose_thread 中 wait_time 的值可以设置一个更低的默认值吗?比如 100,应该也不会对性能有比较大的影响?800还是有点过于高了,关闭直播页的体验会稍差一点。

如果要做异步请求的话,可以模仿这个提交来做:https://github.com/xfangfang/wiliwili/pull/228/commits/ec3295ec7f774e2a6467775f5fced7c34f870e71

只需要声明好数据结构,按照如下形式调用即可:

HTTP::getResultAsync<LiveDanmuInfo>(
        Api::DanmuInfo,
        {{"id", std::to_string(roomid)},
         {"type", "0"},
        callback, error);

当然你也可以用cpr自己解析一下json,不过json解析的报错或者返回的code报错之类的就需要自己来处理了。

lanytcc commented 8 months ago

可以了,你可以测试一下

xfangfang commented 8 months ago

感谢,看来又要更新版本了

xfangfang commented 8 months ago

发现了一个问题,因为获取token变成异步了,会出现一些比较奇怪的问题,比如:

在获取token返回之前退出直播间,并重新进入。这时候两个异步请求都能正常向后执行。

我想到的一个比较简单的修复是,把获取token的函数提到 activity 里去,这样当 activity销毁的时候,如果异步请求还没有执行结束,那么他的回调就会被舍弃。

    LiveDanmaku::instance().setonMessage(onDanmakuReceived);
    ASYNC_RETAIN
    bilibili::HTTP::getResultAsync<LiveDanmakuinfo>(
        "https://api.live.bilibili.com/xlive/web-room/v1/index/"
        "getDanmuInfo?type=0&id=" +
            std::to_string(this->liveData.roomid),
        {},
        [ASYNC_TOKEN](const auto& info) {
            ASYNC_RELEASE
            LiveDanmaku::instance().connect(
                liveData.roomid,
                std::stoll(ProgramConfig::instance().getUserID()), info);
        },
        [ASYNC_TOKEN](const std::string& error) {
            ASYNC_RELEASE
            brls::Logger::error("getDanmuInfo error:{}", error);
        });