wiliwili Documentation

第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上

RAW Doc

Docker & Self-Hosted Deployment Verified OCI

Deploy wiliwili on any server, homelab, or cloud container platform.

1-Click Terminal Command
bash (docker run)
docker run -d --name wiliwili --restart always xfangfang/wiliwili:latest

Technical Documentation: xfangfang/wiliwili

ℹ️ Provenance: Multi-Tier Ingestion · CodeWiki Reference

Overview (`README.md`)







特点

wiliwili 拥有非常接近官方PC客户端的B站浏览体验
同时支持触屏、鼠标、键盘 与 手柄操控
无论是电脑还是游戏掌机都能获得全新的使用体验

多语言:简、繁、日、韩、英 ...
搜索页:热搜 视频 番剧 影视
筛选页:快速找到想看的影视内容
动态页:关注的UP主最近视频动态
直播页:关注的主播与其他系统推荐
播放页:视频 番剧 电影 纪录片 综艺,支持弹幕与评论
个人页:扫码登录 历史记录 个人收藏 我的追番 我的追剧
主题色:拥有深浅两色主题,跟随系统自动切换

安装

Nintendo Switch

  1. 下载 wiliwili-NintendoSwitch.zip:wiliwili releases
  2. 将 wiliwili.nro 放置在内存卡 switch 目录下。
  3. 在主页 按住 R键打开任意游戏进入 hbmenu,在列表中选择 wiliwili 点击打开即可。
  4. [可选] 在应用内安装桌面图标,入口:设置/实用工具/使用教程

桌面图标会优先尝试打开 switch/wiliwili.nro,如果其不存在,则尝试打开 switch/wiliwili/wiliwili.nro,如果这两个路径都不存在,则打开
hbmenu 自行选择路径。

默认提供的为 OpenGL 版本,最高只能播放 4k@30,你也可以下载到支持原生图形 api
的 deko3d 版本,可以流畅播放 4k@60,不过可能会偶尔崩溃。

PSVita

下载 wiliwili-PSVita.vpk 安装即可:wiliwili releases

开启硬解后可以流畅播放 720P 横屏视频,480P 竖屏视频,部分直播 1080P 原画。

PS4

下载 wiliwili-PS4.pkg 安装即可:wiliwili releases

只支持软解,如果想播放 4k@60 需要在设置中开启低画质解码。

PC

PC客户端支持切换硬件解码、秒开流畅适合老电脑、支持鼠标操控(左键点击 右键返回 中键刷新)

下载对应系统的安装包运行即可:wiliwili releases

[!TIP]
现在 Linux & Steam Deck 用户可以通过系统自带的软件商店(如Discover、GNOME Software)搜索 wiliwili 进行下载。
更多使用技巧请参考 项目 WIKI

文档

在各位开发者的帮助下,wiliwili 支持了一系列包管理器,同时 wiliwili 还拥有丰富的自定义选项,包括:使用 Anime4K
提升观感,自定义字体及图标等等
前往 项目 WIKI 查看更多使用技巧

TODO list

如果你有其他改进的想法或创意,欢迎在讨论区交流:Discussions

  • 初步完成底层基础组件、首页各类推荐视频、用户视频播放页
  • 微调页面、解决播放器启动速度慢、解决播放页面退出卡顿
  • 临时解决异步加载导致的空指针问题(图片异步加载某些情况还会出现问题,待修复)
  • 添加番剧/影视播放、添加扫码登录、播放历史、用户收藏夹(收藏夹相关部分工作不稳定)
  • 初步添加搜索
  • 播放页新增分集与UP主最新投稿
  • 完善视频播放页用户评论内容
  • 重构图片异步加载逻辑
  • 解决收藏夹、搜索页某些情况导致闪退的问题
  • 完善搜索页:番剧、影视 转为竖图
  • 完善播放页投稿列表:调整结构、自动加载下一页
  • 播放页展示合集与推荐
  • 添加动态页
  • 添加视频检索页
  • 完善设置页
  • 弹幕相关设置
  • 点赞、投币、收藏
  • 拖拽调节进度
  • 增加单手模式使用一个手柄来控制播放器
  • NSP forwarder自动检查多个位置的nro文件,避免无法打开
  • 增加设置使首页无法通过返回退出,避免误触
  • 使用教程添加未指明的快捷键说明
  • 重压摇杆临时快进
  • 支持切换按键图标
  • 应用内多语言切换
  • 重构搜索页面
  • 评论@显示不同颜色
  • 完善评论图片
  • 评论大表情包所在行增加行高
  • 支持webp图片
  • 搜索支持搜索用户
  • 长按一键三连
  • 支持个人主页
  • 评论跳转进度
  • 评论跳转搜索
  • 评论下方的更多信息 (up主点赞等内容)
  • 投票评论
  • 互动视频

反馈问题前要做的事

  1. 网络相关的问题附加 网络诊断截图,入口:应用内设置/实用工具/网络诊断
  2. [Switch用户] 要确保 大气层和系统固件 更新到 最新 ,内存卡为 FAT32
  3. [Switch用户] 如果打开应用黑屏时间过长,可以尝试删除内存卡目录 config/wiliwili 重新进入
  4. 确保 系统时间正确、系统网络设置正确(主要是DNS)、如果使用了网络代理请在反馈前关闭并重新测试
  5. 查找有没有其他人出现过类似的问题:Issues
  6. 完整且详细地 描述你的问题,最好附加演示视频、截图。
  7. 尝试复现问题,尽力找到BUG出现的规律

贡献

软件移植

本应用基于 nanovg 绘制界面,nanovg 底层可移植切换到任意图形库,已有 OpenGL/Vulkan/Metal 等支持。
视频播放部分则使用 FFMPEG + MPV 绘制,默认使用 OpenGL,有 D3D11/Deko3d/Gxm 或软件渲染支持。
触摸/按键/输入法等平台相关功能通过 GLFW 或 SDL 来支持,也可以脱离二者直接实现,比如 Gxm 版 PSV。

如果你要移植的设备支持 OpenGL(ES) 那么一般来说,直接编译就能正常运行。
如果你要移植的设备使用其他底层图形库,那么首先需要移植 nanovg,这可以确保应用主要界面正常,
其次为了更好的性能表现需要 ffmpeg 的硬解和 mpv 的渲染支持。

如果你有想要移植的设备欢迎发一条 issue 讨论,Android / iOS 不在讨论之内。

新功能

如果你有想完成的创意,请在开发前发布一个 issue 讨论,避免和别人的创意撞车浪费了时间

多语言支持

如果你想为软件添加多语言的翻译支持,或者发现了某些翻译存在问题需要订正,请查看 #52
了解如何贡献翻译

代码分支

主分支 yoga 为最新版本的代码
开发分支 dev 为正在开发中的代码,任何新的 PR 都需要向 dev 分支提交

开发

shell
# 拉取代码
git clone --recursive https://github.com/xfangfang/wiliwili.git
cd wiliwili

PC本地运行

目前 wiliwili 支持运行在 Linux macOS 和 Windows上

macOS

shell
# macOS: install dependencies
brew install mpv webp

cmake -B build -DPLATFORM_DESKTOP=ON
make -C build wiliwili -j$(sysctl -n hw.ncpu)

Linux

不同 Linux 的编译过程或依赖可能不同,这里是一份总结:#89

欢迎在上面的链接中写出你所使用系统的编译过程供大家参考。

shell
# Ubuntu: install dependencies
sudo apt install libssl-dev libmpv-dev libwebp-dev

cmake -B build -DPLATFORM_DESKTOP=ON
make -C build wiliwili -j$(nproc)
shell
# 如果你想安装在系统路径,并生成一个桌面图标,请使用如下内容编译
cmake -B build -DPLATFORM_DESKTOP=ON -DINSTALL=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=/usr
make -C build wiliwili -j$(nproc)
sudo make -C build install

# uninstall (run after install)
sudo xargs -a build/install_manifest.txt rm

Windows

shell
# Windows: install dependencies (MSYS2 MinGW64)
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake mingw-w64-x86_64-make \
  git mingw-w64-x86_64-mpv mingw-w64-x86_64-libwebp

cmake -B build -G "MinGW Makefiles" -DPLATFORM_DESKTOP=ON
mingw32-make -C build wiliwili -j$(nproc)

交叉编译 Switch 可执行文件 (wiliwili.nro)

推荐使用docker构建,本地构建配置环境略微繁琐不过可用来切换底层的ffmpeg或mpv等其他依赖库更灵活地进行调试。

以下介绍 OpenGL 下的构建方法,deko3d (更好的硬解支持)请参考:scripts/build_switch_deko3d.sh

Docker

shell
docker run --rm -v $(pwd):/data devkitpro/devkita64:20251117 \
  bash -c "/data/scripts/build_switch.sh"

本地编译

shell
# 1. 安装devkitpro环境: https://github.com/devkitPro/pacman/releases

# 2. 安装依赖
sudo dkp-pacman -S switch-glfw switch-libwebp switch-cmake switch-curl devkitA64

# 3. 安装自定义依赖
# devkitpro提供的提供的 ffmpeg/mpv 无法播放网络视频
# 手动编译方法请参考:scripts/README.md
base_url="https://github.com/xfangfang/wiliwili/releases/download/v0.1.0"
sudo dkp-pacman -U \
    $base_url/switch-ffmpeg-7.1-1-any.pkg.tar.zst \
    $base_url/switch-libmpv-0.36.0-3-any.pkg.tar.zst

# 4. build
cmake -B cmake-build-switch -DPLATFORM_SWITCH=ON
make -C cmake-build-switch wiliwili.nro -j$(nproc)

交叉编译 PSV 可执行文件

使用本地环境来编译可以参考:

注意: 我们使用自定义的 mbedtls, curl 和 ffmpeg 作为依赖, 在使用本地环境编译时,请先卸载 vitasdk 中的相关库,再安装指定的依赖.

shell
# 构建 OpenGL ES 2.0 版
docker run --rm -v $(pwd):/src/ xfangfang/wiliwili_psv_builder:latest \
    "cmake -B cmake-build-psv -G Ninja -DPLATFORM_PSV=ON \
        -DMPV_NO_FB=ON -DUSE_SYSTEM_CURL=ON -DUSE_SYSTEM_SDL2=ON \
        -DCMAKE_BUILD_TYPE=Release && \
        cmake --build cmake-build-psv"

# 构建 Gxm 版 (推荐)
docker run --rm -v $(pwd):/src/ xfangfang/wiliwili_psv_builder:latest-gxm \
    "cmake -B cmake-build-psv -G Ninja -DPLATFORM_PSV=ON \
        -DUSE_SYSTEM_CURL=ON -DUSE_GXM=ON -DUSE_VITA_SHARK=OFF \
        -DCMAKE_BUILD_TYPE=Release && \
        cmake --build cmake-build-psv"

交叉编译 PS4 可执行文件

使用本地环境来编译可以参考:

shell
docker run --rm -v $(pwd):/src/ xfangfang/wiliwili_ps4_builder:latest \
    "cmake -B cmake-build-ps4 -DPLATFORM_PS4=ON \
        -DMPV_NO_FB=ON \
        -DUSE_SYSTEM_CPR=ON && \
        make -C cmake-build-ps4 -j$(nproc)"

GLFW or SDL

wiliwili 使用 nanovg 绘制图形和文字,对于创建窗口、按键触摸、输入法等支持是通过 GLFW(默认) 或 SDL 完成的。

因为 GLFW 支持平台有限,在移植到新平台时可以使用 SDL 或者自行实现上述对应接口。

shell
# 示例
cmake -B build -DPLATFORM_DESKTOP=ON -DUSE_SDL2=ON
cmake --build build

应用截图

Acknowledgement

The development of wiliwili cannot do without the support of the following organization and open source projects.

Special thanks


Overview (`scripts/README.md`)

Build ffmpeg and mpv for switch

If building using macOS, additional tools need to be installed.

shell
brew install gnu-sed coreutils

# you need add a "gnubin" directory to your PATH with: 
PATH="`brew --prefix gsed`/libexec/gnubin:$PATH"
PATH="`brew --prefix coreutils`/libexec/gnubin:$PATH"

Build and install

shell
sudo dkp-pacman -S switch-pkg-config dkp-toolchain-vars switch-zlib \
    switch-bzip2 switch-libass switch-libfribidi switch-freetype \
    switch-harfbuzz switch-mesa switch-mbedtls

libs=(libuam deko3d dav1d libass ffmpeg mpv)
for lib in ${libs[@]}; do
    pushd switch/$lib
    dkp-makepkg -i
    popd 
done

Precompiled

text
base_url="https://github.com/xfangfang/wiliwili/releases/download/v0.1.0"
sudo dkp-pacman -U \
    $base_url/switch-ffmpeg-7.1-1-any.pkg.tar.zst \
    $base_url/switch-libmpv-0.36.0-3-any.pkg.tar.zst

Acknowledgement

Huge thanks to averne Cpasjuste and proconsule


Overview (`scripts/switch-forwarder/README.md`)

构建 NSP forwarder (桌面图标)

  1. make 编译
    shell
    make
    make wiliwili.nacp
  2. hacbrewpack 打包
    新建 switch-hacbrewpack 目录,将设备key放置在目录下命名为 prod.keys
    shell
    mv build/exefs/main switch-hacbrewpack/exefs/main
    mv build/exefs/main.npdm switch-hacbrewpack/exefs/main.npdm
    mv wiliwili.nacp switch-hacbrewpack/control/control.nacp
    cp ../../resources/icon/icon.jpg switch-hacbrewpack/control/icon_AmericanEnglish.dat
    
    cd switch-hacbrewpack
    hacbrewpack -k prod.keys --titleid 010ff000ffff0001 --titlename wiliwili --noromfs --nologo

感谢

  1. https://github.com/switchbrew/nx-hbloader
  2. https://github.com/The-4n/hacBrewPack

Overview (`wiliwili/include/activity/README.MD`)

wiliwili Activity

应用页面,称为Activity,其中可包含任意多的Fragment(参考Android开发中的相关概念,下面称之为子页面)

页面功能简述

main_activity:

包含:首页、动态、我的 三个子页面

player_activity:

视频播放界面,以及:评论、相关推荐 两个子页面

settings_activity:

应用的设置界面

search_activity:

视频搜索界面

其他页面

其他页面由 子页面 通过 其他继承Activity的子类(如:brls::Dialog) 直接封装而成,此类页面不涉及复杂功能故不单独列出。


Overview (`wiliwili/include/fragment/README.MD`)

wiliwili Fragment

子页面,称为Fragment(参考Android开发中的概念)。当某页面(Activity)过于复杂时,会将部分页面划分为多个子页面。

首页:
首页_tab、首页推荐、首页直播、首页热门、首页热门排行榜、首页追番、首页影视、追番分类查看、影视分类查看

动态:

我的:
我的tab、我的历史、我的收藏、我的稍后再看

搜索:

设置:

其他:
粉丝页、关注页


Overview (`wiliwili/include/presenter/README.MD`)

wiliwili Presenter

调用B站接口的逻辑层封装

一般来说 fragment中的各个页面会继承Presenter下的各个页面请求逻辑封装类,在需要的时候(一般是构造函数里)调用requestData()
,开始请求数据。 当请求的数据完成后,各个页面中的回调函数被触发。

示例:

presenter/demo.hpp

c++
class Demo {
public:
    virtual void onSuccess(const bilibili::DemoResult &result){}

    void requestData() {
        this->request(1, 24);
    }

    void request(int index = 1, int num = 24) {
        // 异步执行的网络请求
        async.run([this, index, num](const bilibili::DemoResult &result){
        // 异步执行结束后,调用:
            this->onSuccess(result);
        });
    }
};

fragment/page_demo.hpp

c++
class PageDemo : public Demo, public brls::Box{
    PageDemo(){
        this->inflateFromXMLRes("xml/fragment/demo.xml");
        this->requestData();
    }
    
    void onSuccess(const bilibili::DemoResult &result){
        // 获取到数据,更新界面
        
        brls::Threading::sync([this, result](){
            // 注意:部分组件的更新需要在主线程
        });
    }
};

Winrt Docs Key (`winrt/docs/key.md`)

导入 msix 安装包所需证书

打开 key.pfx 文件

选择存储位置为本地计算机
一直下一步到出现证书存储

选择:将所有证书都放入下列存储

点击浏览,选择受信任的根证书颁发机构
一直下一步直到完成导入。


--- METRICS ---