音视频直播移动开发【免费下载链接】pure_live纯粹直播:哔哩哔哩/虎牙/斗鱼/快手/抖音/网易cc/YY直播/Twitch直播/SOOP直播/M38自定义源应有尽有。项目地址https://gitcode.com/gh_mirrors/pur/pure_live点击查看免费下载本文基于 pure_live 仓库中的搜索能力登记审计文档docs/SEARCH_REGISTRY_COVERAGE_AUDIT_2026_09_23.md结合lib/domains/live/presentation/search/下的能力合同实现、Sites平台注册表与 HLS 解析链源码完整还原本次「46 平台 vs 32 平台」能力登记缺口的发现过程、14 个站点的能力补齐决策、批量回归中暴露的三个相邻缺陷及其修复方式并给出可验证的源码依据。读者可借此掌握 pure_live 搜索页「能力登记 → 控制器分派 → UI 文案与按钮」这条完整链路的运作机制以及如何用能力合同表驱动平台搜索的覆盖声明。1. 背景能力登记与注册表之间的 14 个缺口pure_live 的搜索页并非每个接入平台都默认具备原生搜索。它依赖两张静态表协同工作平台注册表Sites.supportedSiteIdslib/domains/live/data/platforms/sites.dart声明当前受支持并可构建适配器的站点 ID能力合同表LiveSearchCapabilities._byPlatformlib/domains/live/presentation/search/search_capability.dart逐平台声明「原生搜索覆盖范围 是否支持分页 是否支持网页搜索」。审计以这两张表对照发现注册适配器共46个而能力表当时只登记了32个缺失的14个站点其实都已在各自适配器中实现了searchRoomsCancellable可取消原生搜索却因未登记而被搜索页按「未知平台默认值」处理——即被判成webOnly网页搜索统一走通用百度链接。这导致真实能力与 UI 表现脱节。更直接的回归红灯来自 Shopee Live能力预期应为liveAndOffline原生搜索可返回直播中与未开播内容实际却显示为webOnly。这正是能力表缺登记造成的「明明能搜、却被迫跳网页」的典型表现。从当前仓库源码看本次补齐的成果仍保留在能力表中fc2live、steambroadcast、jdlive、kugoulive、baidulive、sixroom、looklive等站点现已在_byPlatform中完成登记search_capability.dart而 Shopee Live、NimoTV、Rumble、GoodGame、VK Video Live、Dailymotion、淘宝直播等站点从 sites.dart 的retiredSiteIds可以看到后续已按 3.2.8 / 3.2.11 的维护策略退役但被保存的收藏、历史与分享链接仍会以「retired」只读入口呈现而非当作未知链接忽略。2. 能力合同体系NativeSearchCoverage与LiveSearchCapability理解本次补齐的前提是先看懂能力合同的数据结构。核心定义位于 lib/domains/live/presentation/search/search_capability.dartenum NativeSearchCoverage { liveOnly, // 原生接口只返回正在直播的房间 liveAndOffline, // 返回直播中及部分未开播房间 channelLookup, // 支持精确频道 ID / 频道直播链接可含离线频道 roomLookup, // 支持精确场次/房间 ID / 官方直播链接可含已结束场次 showcaseSnapshot, // 精确 UID/官方房间链接 公开推荐页内昵称过滤 localChannels, // 本机已导入频道IPTV不参与网络主播搜索 webOnly, // 只有网页搜索入口 unavailable, // 未接入搜索 } class LiveSearchCapability { const LiveSearchCapability({required this.coverage, required this.supportsPagination, this.supportsWebSearch true}); final NativeSearchCoverage coverage; final bool supportsPagination; final bool supportsWebSearch; bool get supportsNativeSearch coverage ! NativeSearchCoverage.webOnly coverage ! NativeSearchCoverage.unavailable; bool get mayIncludeOffline coverage NativeSearchCoverage.liveAndOffline || coverage NativeSearchCoverage.channelLookup || coverage NativeSearchCoverage.roomLookup; }几个关键语义supportsNativeSearch是控制器筛选「可走原生搜索站点」的唯一边界只要不是webOnly或unavailable就进入原生搜索分派supportsPagination决定是否允许下拉加载后续页由_canLoadAnotherPage结合适配器是否实现LiveSearchPaginationPolicy与「停滞页上限」共同裁决supportsWebSearch决定搜索页是否展示「继续网页搜索」按钮mayIncludeOffline只是对语义的便捷归纳供审计与文案引用。查找逻辑是兜底式的search_capability.dartstatic const LiveSearchCapability _unknown LiveSearchCapability( coverage: NativeSearchCoverage.webOnly, supportsPagination: false, ); static LiveSearchCapability forPlatform(String id) _byPlatform[id.toLowerCase()] ?? _unknown;_unknown正是审计发现的「缺口放大器」任何未登记平台都会静默落入webOnly且禁分页随后被buildSearchUrl的default分支导向通用百度链接search_controller.dart。因此「登记」不只是文档问题而是直接影响用户搜索路径的真实分派开关。3. 本批补齐的 14 个站点三张能力合同审计按能力合同把 14 个站点分成三批登记表格如下忠实继承原文档能力合同本批补齐的平台当前快照/目录匹配及精确查询可能返回未开播、受限或未知状态Shopee Live、NimoTV、Rumble、GoodGame、FC2 Live、Steam Broadcasts、京东直播、酷狗直播、六间房直播原生搜索及频道/场次定位保留平台页码或游标VK Video Live、Dailymotion精确场次/房间与有限推荐页匹配淘宝直播、百度直播、LOOK 直播每个平台的具体取值以当前仓库仍保留的登记为例fc2liveliveAndOffline supportsPagination: true 关闭网页搜索search_capability.dart。其适配器在 fc2_site.dart 实现了可取消搜索先尝试把关键词解析为精确频道 IDFc2Link.parseChannelId命中则单房间返回否则在_directory()目录快照内按频道 ID、用户名、标题、分类名做本地匹配并本地分页steambroadcastliveAndOffline supportsPagination: truesearch_capability.dartjdlive、kugouliveliveAndOffline supportsPagination: truesearch_capability.dartbaiduliveroomLookup supportsPagination: falsesearch_capability.dart即只支持精确房间定位不提供搜索后续页sixroomliveAndOffline supportsPagination: falsesearch_capability.dartlookliveroomLookup supportsPagination: falsesearch_capability.dart。分页布尔值逐项与实现核对的结果同样在文档中固化下来可当作验收基准支持后续页或有限快照本地页VK、Nimo、Dailymotion、Rumble、GoodGame、FC2、Steam、京东、酷狗不提供搜索后续页Shopee、淘宝、百度、六间房、LOOK。此外14 项的supportsWebSearch全部关闭避免再出现「官方站点搜索按钮实际把用户丢给百度」的误导。Dailymotion 有一个值得注意的语义细节关键词搜索返回的是当前直播但精确live-videoID 可以返回已结束的直播因此整体覆盖被标为「可含离线」liveAndOffline而不是简单的liveOnly。4. 从登记到 UI搜索控制器的能力分派链能力表登记完成后真正消费它的是 lib/domains/live/presentation/search/search_controller.dart 中的SearchController。整条链路如下。4.1 可搜索站点筛选_searchPage在每次发起搜索前用forPlatform过滤出支持原生搜索的站点search_controller.dartfinal searchableSites selectedSites.where((site) { final capability LiveSearchCapabilities.forPlatform(site.id); return capability.supportsNativeSearch (!append || (_hasMoreByPlatform[site.id] ?? true)); }).toList();如果某单个平台不可原生搜索则根据其能力给出明确文案supportsWebSearch为真时提示「当前使用网页搜索入口」否则提示「暂未接入搜索」search_controller.dart。4.2 并发与超时边界搜索控制器的几个硬边界常量search_controller.dartliveSearchRequestTimeout Duration(seconds: 12)单个平台的搜索请求超时maxConsecutiveStagnantSearchPages 2搜索接口常有一页重复的边界重叠允许连续两页无新增后停止继续翻页防止「同一载荷刷到底」maxConcurrentNativeSearchSites 12全部站点搜索时并发上限_searchSitesBounded用固定槽位 Future.any实现「完成即补位、先完成先渲染」不让最慢平台拖住整个结果网格。4.3 取消与旧接口兼容适配器通过 lib/shared/platforms/live_search.dart 的两个可选接口表达能力LiveCancellableSearch实现searchRoomsCancellable(keyword, {page, pageSize, cancel})把 DioCancelToken透传给底层 HTTPLiveSearchPaginationPolicy实现supportsSearchPaginationFor(keyword)应对「精确查询单结果 关键词分页源」混合型适配器。扩展方法searchRoomsWithCancellationlive_search.dart对旧式searchRooms做兼容实现可取消接口的直接等待未实现的用Future.any同时监听请求与取消信号超时到达时抛TimeoutException(Native search deadline, requestTimeout)。4.4 能力文案与网页搜索按钮capabilityTextsearch_controller.dart按当前 tab 生成用户可见的覆盖说明对应本地化文案集中在 assets/translations/zh.jsonsearch_coverage_all_native「App 内原生搜索覆盖全部 {total} 个平台未开播结果仅在平台接口返回时显示。」search_coverage_all原生覆盖 {native}/{total}并点名仍走网页搜索的站点search_coverage_live_and_offline/search_coverage_live_only分别描述「含部分未开播」与「仅直播中」。canOpenWebSearchsearch_controller.dart与openWebSearchsearch_controller.dart决定「继续网页搜索」按钮的可见性与目标 URLLinux 走外部浏览器Windows 依赖 WebView2缺失时弹下载引导其余平台进入应用内WebSearchControllerlib/domains/live/presentation/search/web_search_controller.dart它会在浏览过程中用WebSearchRoomParser识别受支持平台的房间链接弹确认后直接接管播放。5. 批量回归发现的相邻缺陷与修复补齐登记后批量回归不只是验证搜索还顺带暴露了三个「相邻」缺陷。这正是审计文档的实战价值所在。5.1 RumbleHLS master 多行文本被错误折叠症状Rumble 浏览器返回的 HLS master 是多行文本此前_parseMedia调用通用字符串归一化_string把全部空白含换行折叠为单个空格导致parseMaster读不到任何#EXT-X-STREAM-INF行最终报mediaUnavailable。修复原则对playlist保留原文仅校验其类型真正的逐行解析交给下游解析器由它们继续执行 512 KiB 体积上限、媒体主机与路径验证。当前仓库印证Rumble 已退役后同类约定仍可在这条解析链上看到lib/domains/live/data/stream/playback_manifest_probe.dartPlaybackManifestProbe以maximumBytes 512 * 1024限制体积_stripBom去除 BOM 后只做classifyHlsManifest(body)分类body 原文原样保留不再做空白折叠lib/shared/platforms/steambroadcast/steam_broadcast_api.dartvalidateMaster对 master 逐行处理先确认#EXTM3U前缀与 1 MiB 上限再逐行扫描#EXT-X-STREAM-INF/#EXT-X-MEDIA对其后紧跟的 URI 校验 https、媒体主机与 Steam 广播路径结构lib/core/stream/hls_master_selection.dartHlsMasterPlaylist.parse用LineSplitter逐行解析对变体数、版本号、分辨率、帧率、码率、音频组、循环/重叠 URI 都做失败即关闭fail-closed的严格校验。5.2 Dailymotion未知观看数从null改为空字符串Dailymotion 在「没有当前观看数」时使用空字符串表示未知而旧断言要求null导致测试与实现语义不一致。修订断言并新增「精确已结束 live-video 返回离线结果」的回归用例把第 3 节提到的liveAndOffline覆盖语义固化进测试。5.3 FC2门票房间不被误过滤FC2 的门票房间按适配器合同仍显示为「受限卡片」Fc2State.restricted会触发fc2live_access_restricted提示见 fc2_site.dart只有 open-chat 的type0才被排除。旧测试把门票卡片误计为「已过滤」现对齐为保留 3 张卡片并维持受限断言使测试与适配器合同一致。5.4 快手原生搜索仍为空保持网页入口快手适配器虽然实现了searchRoomskuaishou_site.dart但上游网页搜索页本身不列出房间源码注释引用 upstream #881其live_api/search/author返回的是主播列表而非房间流因此本次审计结论是快手的原生搜索结果仍为空继续保持既有网页入口。当前仓库中快手在能力表中登记为liveAndOffline supportsPagination: truesearch_capability.dart同时buildSearchUrl仍保留https://live.kuaishou.com/search?keyword$q网页地址search_controller.dart两种入口并存。6. 门禁与边界回归数字与验收范围审计文档给出了完整的门禁口径供后续任何搜索相关改动参照搜索能力/Widget 首批83/83 全部通过14 站适配器首批72 PASS / 4 FAIL4 个失败即上文相邻缺陷所引发修订及新增 Dailymotion 离线夹具后19 文件集中回归187/187全部通过静态诊断最终定向Analyze无诊断输出。测试覆盖证明的对象是源码分派能力表 → 控制器筛选、输入合同searchRoomsCancellable参数语义、关键 UI 动作网页搜索按钮、覆盖文案与确定性平台夹具。审计同时明确声明边界各平台「当前生产可达性、媒体解码、Android/Windows 原生交互」仍按验收矩阵单独闭环本批未操作设备即不把本批测试结果当作设备级回归结论。7. 结论与可验证路径这次审计把「能力存在」与「能力被 UI 承认」两件事对齐了任何新接入平台都必须先登记能力合同否则会被_unknown兜底成webOnly用户看到的只会是百度网页搜索能力登记必须逐字段与适配器实现核对覆盖类型、分页、网页搜索开关Shopee 的liveAndOffline预期 vswebOnly实际就是缺核对的反例批量回归的价值不止于搜索本身——Rumble 的mediaUnavailable、Dailymotion 的空字符串语义、FC2 的门票卡片计数都是在补齐过程中被一同揪出的真实缺陷。仓库内可继续深入的关键路径能力合同定义与登记表lib/domains/live/presentation/search/search_capability.dart能力消费与 UI 分派lib/domains/live/presentation/search/search_controller.dart、lib/domains/live/presentation/search/search_page.dart平台注册表与退役表lib/domains/live/data/platforms/sites.dart可取消搜索与分页策略接口lib/shared/platforms/live_search.dartHLS 校验链lib/domains/live/data/stream/playback_manifest_probe.dart、lib/core/stream/hls_master_selection.dart、lib/shared/platforms/steambroadcast/steam_broadcast_api.dart能力文案本地化assets/translations/zh.json验证方式上可在仓库根目录对上述lib路径执行flutter analyze确认静态诊断干净并按能力表逐平台构造关键词夹具执行原生搜索回归若后续在受控环境接入设备再按验收矩阵补充生产可达、媒体解码与 Android/Windows 原生交互的设备级闭环即可完整复现本审计的门禁口径。赞分享音视频直播移动开发【免费下载链接】pure_live纯粹直播:哔哩哔哩/虎牙/斗鱼/快手/抖音/网易cc/YY直播/Twitch直播/SOOP直播/M38自定义源应有尽有。项目地址https://gitcode.com/gh_mirrors/pur/pure_live点击查看免费下载相关推荐pure_live 搜索页可达布局与能力动作审计62 项 Widget 测试驱动的溢出修复与平台能力对齐pure_live 搜索页可达布局与能力动作审计62 项 Widget 测试驱动的溢出修复与平台能力对齐 本文基于仓库审计文档 SEARCH_PAGE_LAY音视频直播移动开发Cypress搜索功能测试智能搜索场景覆盖Cypress搜索功能测试智能搜索场景覆盖 引言为什么搜索功能测试如此重要 在现代Web应用中搜索功能已成为用户交互的核心环节。无论是电商平台、内容管理测试质量保障前端接口测试SGLang Lightning Attention 能力矩阵与 seg_la 线性注意力测试覆盖深度解析SGLang Lightning Attention 能力矩阵与 seg_la 线性注意力测试覆盖深度解析 本篇指南以 SGLang 仓库中 test/regi模型推理服务推理引擎人工智能大模型本地部署多模态上一篇GPU显存终极压力测试用memtest_vulkan深度诊断你的显卡健康下一篇如何用免费工具掌握德州扑克的科学打法TexasSolver为你揭秘创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考