0
Fork 0
mirror of https://github.com/Silent1566/webhtv.git synced 2026-10-16 10:32:44 +00:00

Compare commits

...

1,360 commits

Author SHA1 Message Date
Silent1566
edf04f9b50
release: v5.6.0-beta-202609220102 正式发布
将测试包 v5.6.0-beta-202609220102 对应内容合并到 main。
2026-09-22 13:28:17 +08:00
Silent1566
9d3dd9a73c
Merge pull request #344 from Silent1566/dev2
修复 release 构建中 Chaquopy JAR 蜘蛛类被 R8 移除
2026-09-22 01:02:17 +08:00
Silent1566
8bc9d13926 fix(proguard): keep com.fongmi.chaquo classes for jar-based python spiders
Verification: R8 real release variant (:app:minifyMobileArm64_v8aReleaseWithR8) BUILD SUCCESSFUL in 4m17s without fastRelease; processed configuration.txt contains "-keep class com.fongmi.chaquo.** { *; }"; seeds.txt lists com.fongmi.chaquo.Loader/Spider/Platform; dexdump on newly generated app/build/intermediates/dex/mobileArm64_v8aRelease/minifyMobileArm64_v8aReleaseWithR8/classes.dex confirms original-name class descriptors Lcom/fongmi/chaquo/Loader; and Lcom/fongmi/chaquo/Spider;, classes2.dex has Lcom/fongmi/chaquo/Platform;, matching the pre-fix failure evidence where the 9-21 installed release APK had no Loader class and spring.jar reflection logged ClassNotFoundException: com.fongmi.chaquo.Loader

Task-Guard: chaquo-r8-keep-20260922
2026-09-22 00:44:41 +08:00
Silent1566
95bb39fcc2
Merge pull request #343 from Silent1566/dev2
修复推送媒体路径误触发 TMDB 匹配并同步 beta 最新代码
2026-09-21 22:28:54 +08:00
Silent1566
7f46ee0e0b Merge remote-tracking branch 'origin/beta' into dev2 2026-09-21 22:21:02 +08:00
Silent1566
7f6222394e fix: skip TMDB matching for pushed media paths
Verification: PushParserTest: testLeanbackArm64_v8aDebugUnitTest BUILD SUCCESSFUL; mobile arm64-v8a Debug BUILD SUCCESSFUL; adb install -r Success and package verified on 192.168.50.3:5557

Task-Guard: push-tmdb-path-skip
2026-09-21 22:02:16 +08:00
Silent1566
17321ba56d
Merge pull request #342 from Silent1566/dev5
同步上游 Exo 音频起播恢复并完成 dev5 复评
2026-09-21 21:40:20 +08:00
Silent1566
c9dc2ad021 docs: 记录 dev5 未推送改动复评结果
Verification: 81 scoped JVM tests: 0 failures, 0 errors, 1 explicit @Ignore; Leanback/Mobile ARM64 Java compile passed; second source review against pinned Media3 recovery/flush contracts passed; no production changes needed

Task-Guard: C4-dev5-beta-pr-20260921
2026-09-21 21:36:57 +08:00
Silent1566
8325175e63 docs: 记录 C4 第七轮上游合并与验证结果
Verification: 已记录 upstream/main@8e4d9333de 的完整 5 提交台账、merge commit 1bae44dba6 双父、验证结果与 revert -m 1 回滚锚点;文档 git diff --check 通过。

Task-Guard: C4
2026-09-21 21:16:31 +08:00
Silent1566
1bae44dba6 merge: 合并 fish2018/webhtv main 最新音频起播恢复
Verification: 合并 upstream/main@8e4d9333de8ea7346491e71a0b1ab6858a852298:冲突组合保留本地初始化失败立即 PCM 回退并接入上游失败记忆/直通/已缓冲起播恢复;Leanback ARM64 与 Mobile ARM64 Debug Java 编译通过;81 项定向用例中 80 通过、1 项 SystemClock 平台桩用例显式跳过,3 项真实 Media3 恢复集成用例通过。

Task-Guard: C4
2026-09-21 21:15:50 +08:00
www.xueximeng.com
8e4d9333de perf(exo): recover stalled audio startup within buffered media
Verification: Existing Media3 integration: 3 passed, first/resumed startup recovers in existing period without reopening source; healthy direct stays direct. TV32 Debug build and APK v2/ABI checks passed. APK sha256 15c31a01404a1e1678020cecb20df5085508b67ccd880904fb9ef02072654fd5. Policy test selection found no tests; remaining tests explicitly waived by user. No device testing. Evidence: /private/tmp/webhtv-E11-recovery-wx7chb0j.

Task-Guard: E11-first-playback-recovery
2026-09-21 19:54:14 +08:00
Silent1566
150e293402
Merge pull request #341 from Silent1566/dev2
fix(player): 修复播放器切换卡顿与 MPV 纯音频等待
2026-09-21 17:25:05 +08:00
www.xueximeng.com
24fa078d2d fix(exo): honor disabled audio passthrough for all encoded outputs
Verification: 53 scoped JUnit cases pass (46 direct-policy, 7 output-ownership); TV32 Debug build successful in 41s; APK CRC/armeabi-v7a/package/v2 signature pass; SHA256 5a05a6f7009dc1f323d7579053d4ca53437508d56073c57b0d1915a916ca8622; strict checkpoint 0 errors/0 warnings; no connected device or performance claim

Task-Guard: E11-audio-passthrough-switch
2026-09-21 16:35:19 +08:00
www.xueximeng.com
e9fef2b90e docs(exo): define complete first-playback recovery plan
Verification: Research only: strict checkpoint verifier 0 errors/0 warnings; table and stage boundaries; 11 source SHA-256 checks; pinned Chromium source identity; A recovery tag verified; no playback performance claim

Task-Guard: E11-first-playback-research
2026-09-21 16:07:24 +08:00
Silent1566
792be29492 fix(mpv): skip video surface gate for audio playback
Verification: MpvSurfaceLoadPolicyTest and MpvSurfaceLifecycleSourceTest passed; scripts/build_arm64_debug_install.sh --serial 192.168.50.3:5557 built and overlay-installed mobile/arm64-v8a debug; local MP3 MPV session loaded directly with start-file/file-loaded and no initial surface gate wait; dev2 attached-surface variant cannot exercise the not-ready branch, which is covered by policy tests

Task-Guard: FIX-MPV-AUDIO-SURFACE-GATE-20260921
2026-09-21 15:37:40 +08:00
Silent1566
1050dba289 fix(exo): fall back immediately when direct audio init fails
Verification: :app:testLeanbackArmeabi_v7aDebugUnitTest --tests com.fongmi.android.tv.player.exo.ExoCompressedAudioDirectPolicyTest passed; scripts/build_arm64_debug_install.sh --serial 192.168.50.3:5557 installed mobile/arm64-v8a debug with overlay; dev2 did not expose vendor-direct for the tested AAC source, so OEM failure-path verification remains explicitly documented

Task-Guard: E11-switch-player-audio-fallback-20260921
2026-09-21 15:06:25 +08:00
www.xueximeng.com
123d871c02 fix(exo): remember confirmed direct audio failures per media and route
Verification: E11 stage A: 64 scoped host cases passed; final IJK-compatible classifier rerun 10/10 passed; Leanback armeabi-v7a Debug APK built, CRC/ABI/v2 signature verified, SHA256 4093aeff27e55101e6ba199a78e77fd5d1c4bc608aa8f89aeac7939131b0c4f9; checkpoint/link checks passed; target-device startup/performance still pending, early timeout unchanged

Task-Guard: E11-audio-startup-admission
2026-09-21 15:02:55 +08:00
Silent1566
906a0c93f3
Merge pull request #340 from Silent1566/dev2
docs: 补充并校正开发者接入文档
2026-09-21 14:27:06 +08:00
Silent1566
e80027303f docs: 修正开发者接入文档与当前源码不一致的描述
Verification: PASS: 13 integration docs links/source paths; 5 factual corrections cross-checked against Parse.java/Action.java/Local.java/SiteApi.java/JarLoader.java; git diff --check origin/beta..HEAD

Task-Guard: integration-docs-review-20260921
2026-09-21 14:10:39 +08:00
Silent1566
1d425537f5 docs: expand developer integration guides
Verification: 12 module integration docs expanded; total 1164 lines; indexes and relative links validated; no empty docs; root README entry present

Task-Guard: integration-docs-20260921
2026-09-21 14:01:20 +08:00
www.xueximeng.com
8d7ccf42b4 docs(exo): record E11 audio startup design and implementation approval
Verification: E11 research: source/log review, task/index links and recorded local revisions checked; checkpoint verifier passed with 0 errors and 0 warnings; no production changes

Task-Guard: E11-audio-startup-research
2026-09-21 14:00:26 +08:00
Silent1566
23e1bba04a
Merge pull request #339 from Silent1566/dev2
合并 beta 最新代码并修复 E11 压缩音频停滞回退单测门禁
2026-09-21 11:12:54 +08:00
Silent1566
e7999770ef fix(test): make E11 audio stall fixtures independent of android.os.SystemClock
Verification: 真实构建配置(无 returnDefaultValues)下 :app:testMobileArm64_v8aDebugUnitTest 全量 4765 项 0 失败/0 错误/1 跳过 BUILD SUCCESSFUL;:app:testLeanbackArmeabi_v7aDebugUnitTest 以 com.fongmi.android.tv.player.exo.* + FlagSelectionListenerTest 执行 75 类 553 项 0 失败/0 错误/0 跳过 BUILD SUCCESSFUL;git diff --check 通过

Task-Guard: E11-test-clock-independence
2026-09-21 11:09:52 +08:00
Silent1566
f3aa1f08c1 docs: record sixth-round upstream merge review and open test-gate defect
Verification: 第六轮复评记录:定向编译+41 项定向单测通过;mobile 全量单测发现 12 项 E11 夹具 SystemClock 失败并留待独立修复;git diff --check 通过

Task-Guard: beta-sync-review-dev2-20260921
2026-09-21 11:06:04 +08:00
Silent1566
4d80db9199 merge: 合并 fish2018/webhtv main 最新代码(E11 压缩音频停滞回退、Leanback 线路切换延迟)
Verification: 6th C4 round merge of upstream/main@fa09d226f9: 3 Java compiles (mobileArm64/leanbackArm64/leanbackArmeabi_v7a Debug) BUILD SUCCESSFUL 1m4s; 33 E11 audio tests (26 ExoCompressedAudioDirectPolicyTest + 7 ExoAudioOutputStateTest) and 8 FlagSelectionListenerTest pass; git diff --cached --check clean; no conflict markers

Task-Guard: C4
2026-09-21 10:34:42 +08:00
www.xueximeng.com
fa09d226f9 fix: defer leanback cloud route selection until layout completes
Verification: Leanback armeabi-v7a Debug Java compilation PASS; Android 9 API 28 FlagSelectionListenerTest: 8 passed, 0 failures, 0 errors, 0 skipped; actual Leanback layout dispatch and both synchronous refresh exceptions covered; log /private/tmp/webhtv-pan-switch-01j13nva/gradle-tests-2.log

Task-Guard: leanback-pan-switch-layout
2026-09-20 23:17:30 +08:00
Silent1566
16ee00828d
Merge pull request #338 from Silent1566/dev4
feat(following): 优化追更页面视觉与交互
2026-09-20 22:54:18 +08:00
Silent1566
e90d7e2e45 feat(following): 优化追更页面视觉与交互
Verification: :app:testLeanbackArm64_v8aDebugUnitTest :app:testMobileArm64_v8aDebugUnitTest :app:assembleLeanbackArm64_v8aDebug,BUILD SUCCESSFUL in 1m 37s;测试结果无 failures/errors;git diff --check 通过;task_guard check 通过

Task-Guard: beta-sync-review-dev4-20260920-test-fix
2026-09-20 22:49:41 +08:00
www.xueximeng.com
f836d41951 fix(exo): fall back to PCM when compressed audio stalls
Verification: Leanback armeabi-v7a App Java compilation and 33 targeted audio-output JVM tests passed (26 direct-policy, 7 output-ownership; zero failures/errors/skips); upstream checkpoint validation passed. Evidence: /private/tmp/webhtv-E11-audio-stall-zxepv15j/gradle-verified.log. Sony device playback remains unverified.

Task-Guard: E11-audio-direct-stall-fallback
2026-09-20 22:22:23 +08:00
Silent1566
3f94b8e86e
Merge pull request #337 from Silent1566/dev3
合并 beta 最新代码并完成 dev3 选集网格边距复评
2026-09-20 20:54:54 +08:00
Silent1566
e362079845 fix(detail): stabilize TMDB episode grid column margins
Verification: origin/beta 已是基线祖先无需重复合并;两轮复评通过;TmdbEpisodeAdapterTest 15/15 通过;Leanback Arm64 Debug Java 编译通过;Mobile Arm64 Debug APK 覆盖安装成功;1920px 详情页三行网格 outer 28/28px、gap 21px、card 450/451px

Task-Guard: beta-sync-review-dev3-20260920
2026-09-20 20:51:30 +08:00
Silent1566
599f1c5260 fix(detail): align TMDB episode grid outer margins
Verification: TmdbEpisodeAdapterTest BUILD SUCCESSFUL; mobile arm64 debug APK built and overwrite-installed on 192.168.50.3:5559; UI hierarchy shows detail/playback TMDB episode grids both with left=28px, right=28px, card widths=450/451px and gaps=21px at 1920px width

Task-Guard: UI-DETAIL-EPISODE-GRID-MARGIN-20260920
2026-09-20 20:39:35 +08:00
Silent1566
00dc2809f8
Merge pull request #336 from Silent1566/dev2
合并 beta 最新代码并修复 MPV 轨道缓存
2026-09-20 19:25:07 +08:00
Silent1566
5c79ad2841 merge: 合并 beta 最新代码并完成第二轮复评
Verification: git diff --cached --check 通过;合并 origin/beta@2c0f4234d7 无冲突;Mobile/Leanback Arm64 Debug Java 编译与 Mobile Arm64 AndroidTest 编译 BUILD SUCCESSFUL;Mobile Arm64 Debug 全量 JVM 单测 4752 项 0 失败 0 错误 1 跳过;Leanback 定向 MpvPropertyCacheTest 通过;复评未发现阻断问题

Task-Guard: beta-sync-review-dev2-20260920-round2
2026-09-20 19:22:49 +08:00
Silent1566
255a8b5cbc fix(mpv): derive track list cache from NODE snapshot
Verification: git diff --check 通过;Mobile Arm64 Debug 定向单元测试 MpvPropertyCacheTest 4 项全部通过;Mobile/Leanback Arm64 Debug Java 编译通过;复评确认 track-list NODE 快照派生缓存为上行不可省略适配

Task-Guard: FIX-MPV-TRACKLIST-CACHE-20260920
2026-09-20 19:17:28 +08:00
Silent1566
2c0f4234d7
Merge pull request #335 from Silent1566/dev4
修复配置历史当前源保护与删除确认
2026-09-20 18:16:14 +08:00
Silent1566
6077339f3c Merge remote-tracking branch 'origin/beta' into dev4 2026-09-20 18:11:59 +08:00
Silent1566
cd565740ce fix: protect current config history actions
Verification: :app:testMobileArm64_v8aDebugUnitTest 指定 ConfigHistoryCurrentSourceGuardTest、DialogGlassChipStyleTest 通过;:app:compileLeanbackArm64_v8aDebugJavaWithJavac 通过;git diff --check 与最终复评通过

Task-Guard: config-history-current-source-guard
2026-09-20 18:11:43 +08:00
Silent1566
64139076d1
Merge pull request #334 from Silent1566/dev3
修复异步加载时配置引用漂移
2026-09-20 18:02:38 +08:00
Silent1566
e82b826e39 fix: capture config before async load
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.api.config.BaseConfigLifecycleTest 通过;复评 git diff --check 通过

Task-Guard: fix-baseconfig-load-capture
2026-09-20 17:59:22 +08:00
Silent1566
c517950b75
Merge pull request #333 from Silent1566/dev3
修复移动端音轨选中态样式
2026-09-20 17:14:45 +08:00
Silent1566
0f5bdf3b06
Merge pull request #332 from Silent1566/dev4
fix(exo): 保持视频解码模式人工手动切换
2026-09-20 17:14:28 +08:00
Silent1566
0616a992f6 revert(exo): keep video decode mode manual
Verification: CompatFfmpegVideoRendererSourceTest + MpvHardwareDecodePolicyTest + ExoAudioCodecSelectorTest: 9 tests, 0 failures/errors (BUILD SUCCESSFUL); :app:compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean

Task-Guard: E-SP9-manual-decode-contract
2026-09-20 17:06:59 +08:00
Silent1566
9c7c9fbda9 Merge remote-tracking branch 'origin/beta' into dev3 2026-09-20 17:01:40 +08:00
Silent1566
fe6c540628 fix: support activated mobile audio track style
Verification: :app:testMobileArm64_v8aDebugUnitTest DialogGlassChipStyleTest BUILD SUCCESSFUL; mobile/arm64-v8a Debug build succeeded and overwrite-installed successfully on 192.168.50.3:5559

Task-Guard: fix-mobile-audio-track-activated-style
2026-09-20 16:55:12 +08:00
Silent1566
4a9f0fd14d fix(exo): fall back to software when hardware codec is absent
Verification: CompatFfmpegVideoRendererSourceTest passed; arm64 debug APK built/installed on 192.168.50.3:5561; same H.265 live now renders with ffmpegLavc63.3.100-hevc, videoSize=1280x720, firstFrameMs=9798; APK sha256 a2cc6af0d432556c2ea2b16b1f81e48652a911e7a76a2409944f4453e86a085d

Task-Guard: E-SP9-unsupported-video-soft-fallback
2026-09-20 16:41:23 +08:00
Silent1566
07ebdff1ce fix: preserve selected audio track text state
Verification: :app:testMobileArm64_v8aDebugUnitTest DialogGlassChipStyleTest BUILD SUCCESSFUL; mobile/arm64-v8a Debug overwrite-installed successfully on 192.168.50.3:5559

Task-Guard: fix-audio-track-selection-color
2026-09-20 16:35:05 +08:00
Silent1566
875f897bae
Merge pull request #331 from Silent1566/dev4
merge: 同步 beta 最新代码并复评 dev4 改动
2026-09-20 16:11:54 +08:00
Silent1566
71bbd2ed04 docs: record C18 final delivery state
Verification: C18 closure record updated with merge commit 9f998d6808, recovery tag, origin/dev4 push, PR #331 and ff-only pull result; diff check passed

Task-Guard: C18-delivery-record-20260920
2026-09-20 16:09:03 +08:00
Silent1566
1cb2474f40 docs: close C18 beta sync delivery record
Verification: closure documentation records merge commit 9f998d6808, recovery tag, origin/dev4 push, PR #331 CLEAN/MERGEABLE, and ff-only pull Already up to date; markdown diff check passed

Task-Guard: C18-closure-20260920
2026-09-20 16:08:34 +08:00
Silent1566
9f998d6808 merge: sync beta latest and re-review dev4 changes
Verification: merged origin/beta b4501c91c7 into dev4; resolved TmdbDetailActivity import conflict preserving FOLLOW-1 and ConfigEvent; git diff --check and git diff --cached --check pass; :app:compileLeanbackArm64_v8aDebugJavaWithJavac and :app:compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; :app:testMobileArm64_v8aDebugUnitTest 4745 tests, 0 failures, 0 errors, 1 skipped

Task-Guard: C18-beta-sync-review-dev4-20260920
2026-09-20 16:07:03 +08:00
Silent1566
ea485ee9bf feat(following): disable feature by default
Verification: FollowingUiSourceTest and full mobile/leanback unit suites passed; Debug APK over-installed on 192.168.50.3:5561; explicit true preference and 2 following rows preserved

Task-Guard: FOLLOW-1-DEFAULT-OFF
2026-09-20 15:38:50 +08:00
Silent1566
b4501c91c7
Merge pull request #330 from Silent1566/dev3
修复 TV 主题配色与更新对话框焦点
2026-09-20 15:36:24 +08:00
Silent1566
a1aad8745e fix(updater): normalize update dialog focus
Verification: :app:compileLeanbackArm64_v8aDebugJavaWithJavac 与 :app:compileMobileArm64_v8aDebugJavaWithJavac 均通过(BUILD SUCCESSFUL)

Task-Guard: unify-update-dialog-button-panel
2026-09-20 15:34:10 +08:00
Silent1566
4158288997 test(following): preserve device data across instrumentation
Verification: androidTest APK compiled; full following instrumentation OK (12 tests); before/after DB comparison PASS for 2 following rows and 2 source rows; main Debug over-install also preserved all rows

Task-Guard: FOLLOW-1-TEST-ISOLATION
2026-09-20 15:17:42 +08:00
Silent1566
bce572f21f feat(following): mark visible cards as read
Verification: mobile and leanback unit suites passed; full following instrumentation OK (12 tests) on 192.168.50.3:5561; visible card auto-marked read and UI assertions confirmed read button/badge hidden

Task-Guard: FOLLOW-1-VISIBLE-READ
2026-09-20 15:03:41 +08:00
Silent1566
27313a3af0 fix(leanback): follow active theme colors
Verification: Leanback arm64-v8a Debug 资源合并和完整构建成功;已覆盖安装到 192.168.50.3:5559;当前更新备份弹窗截图确认页面与弹窗背景统一为主题表面色;已移除 display_dialog_panel_bg、#2196F3 等硬编码主题覆盖;git diff --check 与 task guard check 均通过

Task-Guard: follow-active-theme-colors
2026-09-20 15:01:59 +08:00
Silent1566
934e831de5 fix(following): hide playback action until state is resolved
Verification: mobile and leanback unit suites passed; Debug APK over-installed on 192.168.50.3:5561; with following_enabled=false playback page has no following node/button in UI dump or screenshot

Task-Guard: FOLLOW-1-PLAY-FLASH
2026-09-20 14:42:21 +08:00
Silent1566
2456a3af52 fix(leanback): unify TV background and dialog palette
Verification: Leanback arm64-v8a Debug 资源合并与完整构建成功;已覆盖安装到 192.168.50.3:5559;应用启动成功;1920x1080 截图目视确认电视端页面背景与深色面板配色统一;git diff --check 和 task guard check 均通过

Task-Guard: unify-tv-background
2026-09-20 14:19:59 +08:00
Silent1566
43e02d7d74 fix(following): refresh entries when feature flag changes
Verification: mobile and leanback unit suites passed; Debug APK over-installed on 192.168.50.3:5561; toggling following_enabled off/on restored bottom navigation immediately; playback page screenshot shows 加入追更

Task-Guard: FOLLOW-1-ENTRY-REFRESH
2026-09-20 14:06:07 +08:00
Silent1566
f529af442a
Merge pull request #329 from Silent1566/dev3
修复 MPV HLS 去广告计划通知
2026-09-20 13:18:38 +08:00
Silent1566
d161b65eec docs(following): record TMDB migration verification
Verification: Recorded FollowingMigrationDeviceTest evidence and final following instrumentation OK (12 tests)

Task-Guard: FOLLOW-1-MIGRATION-LEDGER
2026-09-20 13:09:08 +08:00
Silent1566
1e4ecac939 fix(following): migrate source records after TMDB match
Verification: mobile unit tests and androidTest build passed; full following instrumentation OK (12 tests) on 192.168.50.3:5561 with Debug over-install; new migration test passed

Task-Guard: FOLLOW-1-TMDB-MIGRATION
2026-09-20 13:08:51 +08:00
Silent1566
cda4608f73 Merge remote-tracking branch 'origin/beta' into dev3 2026-09-20 12:54:50 +08:00
Silent1566
8cab95c225 fix(mpv): notify when HLS ad removal plan is ready
Verification: Mobile ARM64 and armeabi-v7a focused MPV HLS adblock tests passed; git diff --check passed; Mobile ARM64 debug APK installed on 192.168.50.3:5559; runtime confirmed adblock plan with 2 ranges, user notification for 14 ad segments, file-loaded, and native output boundary armed.

Task-Guard: MPV-ADBLOCK-NOTIFY-20260920
2026-09-20 12:14:11 +08:00
Silent1566
6f0b56f5d9 docs(following): close final verification record
Verification: Recorded final closure evidence: mobile/leanback full unit suites passed; latest Debug over-install; full following instrumentation OK (11 tests); no fatal/main-thread Room logs

Task-Guard: FOLLOW-1-FINAL-CLOSURE
2026-09-20 11:57:12 +08:00
Silent1566
9b17375d2b fix(following): enable detail-page subscriptions
Verification: FollowingUiSourceTest passed on mobileArm64_v8aDebug; detail-page following creation now sets enabled=true and common source compiled

Task-Guard: FOLLOW-1-DETAIL-ENABLED
2026-09-20 11:54:03 +08:00
Silent1566
1cab41ffc9 fix(following): keep planned shows on a daily check
Verification: FollowingSchedulePolicyTest passed on mobileArm64_v8aDebug including planned daily-check case; common source compiled

Task-Guard: FOLLOW-1-PLANNED-DAILY
2026-09-20 11:53:01 +08:00
Silent1566
a8ee7fa55c docs(following): record final audit and verification
Verification: Recorded latest final audit evidence: mobile/leanback unit suites passed, full following instrumentation OK (11 tests) on 192.168.50.3:5561, no fatal/main-thread Room logs

Task-Guard: FOLLOW-1-FINAL-AUDIT
2026-09-20 11:51:57 +08:00
Silent1566
2b8d794393 fix(following): enable imported alist subscriptions
Verification: FollowingAlistImportTest passed on mobileArm64_v8aDebug; imported subscription is enabled and has stable TMDB season identity

Task-Guard: FOLLOW-1-ALIST-ENABLED
2026-09-20 11:49:00 +08:00
Silent1566
7567032bc0 fix(following): gate progress projection by feature flag
Verification: FollowingUiSourceTest passed on mobileArm64_v8aDebug after gating progress projection by following_enabled; common source compiled

Task-Guard: FOLLOW-1-PROJECT-FEATURE-GATE
2026-09-20 11:47:47 +08:00
Silent1566
a6978e6ba4 fix(following): schedule returning shows after next air
Verification: FollowingSchedulePolicyTest passed on mobileArm64_v8aDebug including next-air RETURNING and minimum one-hour-after-check cases; common source compiled

Task-Guard: FOLLOW-1-NEXT-AIR-SCHEDULE
2026-09-20 11:46:50 +08:00
Silent1566
981b63bf21 fix(following): resume from cross-source TMDB history
Verification: FollowingContinueDeviceTest passed on 192.168.50.3:5561; cross-source TMDB history lookup returned stored episode 4 and position 8000 after over-install Debug build

Task-Guard: FOLLOW-1-CONTINUE-CROSS-SOURCE
2026-09-20 11:44:01 +08:00
Silent1566
03b7cd5e78 fix(following): use latest aired episode from season detail
Verification: FollowingMetadataClientTest passed on mobileArm64_v8aDebug including latest-aired episode fixture; common source compiled

Task-Guard: FOLLOW-1-SEASON-LATEST-EPISODE
2026-09-20 11:42:06 +08:00
Silent1566
d5a72def79 fix(following): select source flag by tracked season
Verification: FollowingSourceProbeTest passed on mobileArm64_v8aDebug including tracked-season flag selection; common source compiled

Task-Guard: FOLLOW-1-SOURCE-SEASON-FLAG
2026-09-20 11:41:11 +08:00
Silent1566
a2cb58dbf7 docs(following): record full device regression suite
Verification: Recorded latest full com.fongmi.android.tv.following instrumentation suite evidence: OK (10 tests) on 192.168.50.3:5561 with over-install Debug packages

Task-Guard: FOLLOW-1-DEVICE-SUITE
2026-09-20 11:39:25 +08:00
Silent1566
9e11317afc test(following): verify foreground notification suppression
Verification: FollowingNotifierDeviceTest passed on 192.168.50.3:5561: foreground notifyUpdate returned false and lastNotifiedEpisode stayed unchanged; Debug APK and androidTest APK installed with -r

Task-Guard: FOLLOW-1-NOTIFY-FOREGROUND-TEST
2026-09-20 11:38:58 +08:00
Silent1566
ad76a8b3ea fix(following): keep released metadata monotonic
Verification: FollowingUpdatePolicyTest passed on mobileArm64_v8aDebug including new metadata downgrade guard; common source compiled

Task-Guard: FOLLOW-1-METADATA-MONOTONIC
2026-09-20 11:36:48 +08:00
Silent1566
33398512e3 fix(following): suppress foreground update notifications
Verification: FollowingUiSourceTest passed on mobileArm64_v8aDebug after adding foreground suppression; common source compiled successfully

Task-Guard: FOLLOW-1-FOREGROUND-NOTIFY
2026-09-20 11:35:44 +08:00
Silent1566
feb1f5c787 fix(following): serialize progress projection off the main thread
Verification: mobile unit tests and androidTest APK build passed; FollowingProjectionDeviceTest passed on 192.168.50.3:5561; main-thread project call safely queued and updated watched episode/position

Task-Guard: FOLLOW-1-PROJECT-QUEUE
2026-09-20 11:34:41 +08:00
Silent1566
6c762b863c fix(following): refresh home badges off the main thread
Verification: FollowingUiSourceTest passed for mobile and leanback; mobileArm64_v8aDebug built and installed with adb install -r on 192.168.50.3:5561; app resumed without main-thread Room or FATAL EXCEPTION

Task-Guard: FOLLOW-1-BADGE-CRASH
2026-09-20 11:28:17 +08:00
Silent1566
f90b311716 fix(following): move check-all database read off main thread
Verification: FOLLOW-1 CHECK CRASH: FollowingUiSourceTest and mobile Debug build pass; androidTest APK built/installed with -r; FollowingCheckDeviceTest passes on 192.168.50.3:5561 (OK 1 test), exercising the real Check Updates button without Room main-thread access; visual playback screen confirms matching shadow icon

Task-Guard: FOLLOW-1-CHECK-CRASH
2026-09-20 11:18:48 +08:00
Silent1566
0b34d1821d fix(following): make cancellation async and unify icon color
Verification: FOLLOW-1 CANCEL/ICON: unit tests and mobile Debug build pass; Leanback compile passes; device FollowingDeleteDeviceTest passes; on 192.168.50.3:5561 confirmed real cancel dialog removes both following and following_source rows with no FATAL/Room crash; all mobile layout variants use matching shadow icon

Task-Guard: FOLLOW-1-CANCEL-ICON
2026-09-20 08:50:35 +08:00
Silent1566
035145f9fd
Merge pull request #328 from Silent1566/dev2
合并 beta 最新代码并完成复评验证
2026-09-20 08:33:01 +08:00
Silent1566
e918769af1 merge: 合并 beta 最新代码并完成复评验证
Verification: git diff --check 与 git diff --cached --check 通过;Mobile Arm64 Debug 定向单元测试 143 项全部通过;Leanback Arm64 Debug Java 编译通过;最终复评未发现阻断问题

Task-Guard: beta-sync-review-dev2-20260920
2026-09-20 08:24:25 +08:00
Silent1566
212db245eb fix(following): add playback entry to mobile layout variants
Verification: FOLLOW-1 VIDEO CRASH: FollowingUiSourceTest passes and Debug APK builds; on 192.168.50.3:5561 in forced landscape, VideoActivity opens with visible Add-to-following, clicking it changes to Following and persists without NPE or Room main-thread access

Task-Guard: FOLLOW-1-VIDEO-CRASH
2026-09-19 23:36:26 +08:00
Silent1566
98c198926d fix(following): prevent main-thread crash and add playback entries
Verification: FOLLOW-1 ENTRY: mobile+leanback Java compile pass; FollowingPlaybackBridgeTest and FollowingUiSourceTest pass; FollowingDetailDeviceTest passes on 192.168.50.3:5561 proving main-thread bridge lookup reaches background Room safely; detail header, mobile native playback row, and leanback playback row now expose following actions

Task-Guard: FOLLOW-1-ENTRY
2026-09-19 23:21:32 +08:00
Silent1566
35fa57f1cb
Merge pull request #327 from Silent1566/dev3
广告拦截日志增加分列筛选与多选过滤
2026-09-19 23:08:56 +08:00
Silent1566
ce4df05d3a
Merge pull request #326 from Silent1566/release/v5.6.0-beta-202609191357
release: v5.6.0-beta-202609191357 正式发布
2026-09-19 23:05:43 +08:00
Silent1566
b431186486 Merge remote-tracking branch 'origin/beta' into dev3 2026-09-19 23:00:07 +08:00
Silent1566
4da82aef8b
Merge pull request #325 from Silent1566/dev2
合并 beta 最新代码并硬化 TMDB 凭据边界
2026-09-19 22:52:43 +08:00
Silent1566
6b81241675 docs(following): finalize verification ledger
Verification: Final FOLLOW-1 documentation ledger includes the Debug size/package-constraint record and the passed device backup restore/merge test; remaining external-device limits are explicit

Task-Guard: FOLLOW-1-FINAL-LEDGER
2026-09-19 22:51:12 +08:00
Silent1566
78471f77fd test(following): verify backup restore and merge on device
Verification: FOLLOW-1 BACKUP DEVICE: FollowingBackupDeviceTest passes on 192.168.50.3:5561 using real following.db; full capture/restore, merge dedupe, max watermarks, local scheduling/error preservation, and source table consistency verified

Task-Guard: FOLLOW-1-BACKUP-DEVICE
2026-09-19 22:50:53 +08:00
Silent1566
14b5e6e220 merge: 合并 beta 最新代码并硬化 TMDB 凭据边界
Verification: 17 个定向测试类共 248 项通过(failures=0, errors=0, skipped=0);:app:compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL;git diff --check 与 git diff --cached --check 通过

Task-Guard: beta-sync-review-dev2-20260919-round2
2026-09-19 22:46:16 +08:00
Silent1566
e64abf8df4 docs(following): record debug size and package constraint
Verification: FOLLOW-1 VOLUME: documentation records traceable pre-feature and current Debug APK byte sizes/hashes, explicitly excludes Release per user constraint, and records latest atomic commits

Task-Guard: FOLLOW-1-VOLUME
2026-09-19 22:45:31 +08:00
Silent1566
cd062e3242 fix: allow single-tap mobile ad filter selection
Verification: Mobile targeted layout test passed: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.dialog.AdBlockStatsDialogLayoutTest (BUILD SUCCESSFUL); git diff --check passed

Task-Guard: mobile-ad-filter-single-tap-20260919
2026-09-19 22:39:16 +08:00
Silent1566
8994c01086 fix(following): enforce season bounds and verify scheduler
Verification: FOLLOW-1 RUNTIME: FollowingSourceProbeTest passes for season-bound episode matching; device FollowingSchedulerDeviceTest passes on 192.168.50.3:5561 and directly verifies unique periodic and one-shot work are enqueued and canceled when disabled

Task-Guard: FOLLOW-1-RUNTIME
2026-09-19 22:09:25 +08:00
Silent1566
b85a58209f feat(following): complete list filters and leanback badge
Verification: FOLLOW-1 FILTERS: FollowingUiSourceTest passes, Leanback Java compile succeeds, and device FollowingActivityDeviceTest passes; five filter modes and deterministic sort are implemented, and Leanback home exposes local unread count without network

Task-Guard: FOLLOW-1-FILTERS
2026-09-19 22:05:21 +08:00
Silent1566
fb6b5042f4 fix(following): preserve source fallback and gate leanback entry
Verification: FOLLOW-1 FALLBACK: Leanback SiteInjectHomeButtonSourceTest passes; device FollowingUpdateCoordinatorDeviceTest passes on 192.168.50.3:5561 proving TMDB failure + successful source probe preserves official snapshot, updates source playable episode, resets failure, and probes once; disabled feature hides Leanback home button

Task-Guard: FOLLOW-1-FALLBACK
2026-09-19 22:01:11 +08:00
Silent1566
111bba6ae5 docs(following): record implementation verification boundary
Verification: FOLLOW-1 CLOSE: documentation-only; records final commit/tag ledger, available verification, and explicit API33+/TV/Doze/multi-device unverified boundary without claiming false completion

Task-Guard: FOLLOW-1-CLOSE
2026-09-19 21:57:27 +08:00
Silent1566
1496d617d7 test(following): update leanback home button catalog
Verification: Leanback SiteInjectHomeButtonSourceTest passes with id 8 in ALL while site-injection id 9 remains present

Task-Guard: FOLLOW-1-LEANBACK-TEST
2026-09-19 21:56:48 +08:00
Silent1566
009f4e68d4 docs(tmdb): record auth failure epoch fix
Verification: documentation-only closure: auth-failure epoch fix commit/tag recorded; no build or device test rerun

Task-Guard: C16-config-key-runtime-diagnosis-close
2026-09-19 21:55:28 +08:00
Silent1566
9cd5c6399d fix(tmdb): scope auth failure clearing to subscription epoch
Verification: targeted JVM tests TmdbServiceCredentialScopeTest 4/4, TmdbConfigEffectiveTest 4/4, VodConfigSubscriptionCredentialWiringTest 2/2; Mobile device credential tests 5/5 on SM-N9700 Android 9 at 192.168.50.3:5557; Leanback compile BUILD SUCCESSFUL; real replay reached runtime=1 tmdbReady=true bundle=true

Task-Guard: C16-config-key-runtime-diagnosis
2026-09-19 21:54:33 +08:00
Silent1566
189e622522 fix(following): harden source probe fallback
Verification: FOLLOW-1 PROBE: FollowingSourceProbeTest passes; preferred playable flag wins, empty preferred flag falls back to largest valid flag, all-empty returns null, TMDB episode mapping wins

Task-Guard: FOLLOW-1-PROBE
2026-09-19 21:53:34 +08:00
Silent1566
89a517ce0e fix(following): avoid first fetch notification
Verification: FOLLOW-1 BASELINE: FollowingUpdatePolicyTest passes; first metadata fetch with no prior watermark establishes read/notified baseline and suppresses notification; later episode still notifies

Task-Guard: FOLLOW-1-BASELINE
2026-09-19 21:50:48 +08:00
Silent1566
bc23329e49 feat: add deduplicated multi-select ad log filters
Verification: Gradle mobile/leanback targeted unit and layout tests passed (BUILD SUCCESSFUL); leanbackArm64_v8aDebug APK assembled and installed successfully on 192.168.50.3:5557; app relaunched with HomeActivityCurrent resumed and process alive; git diff --check passed

Task-Guard: ad-stats-dedup-filter-picker-20260919
2026-09-19 21:48:14 +08:00
Silent1566
4eb674d89d feat(following): add detail action panel
Verification: FOLLOW-1 DETAIL: FollowingUiSourceTest passes and mobile+leanback Java compile succeeds; card opens detail action panel covering continue, check, read, source-change and cancel

Task-Guard: FOLLOW-1-DETAIL
2026-09-19 21:47:55 +08:00
Silent1566
dc2e3d4096 test(following): verify activity rendering on device
Verification: FOLLOW-1 DEVICE: FollowingActivityDeviceTest passes on 192.168.50.3:5561, proving real Activity renders stored rows and updates-only filter reduces two records to one

Task-Guard: FOLLOW-1-DEVICE
2026-09-19 21:44:50 +08:00
Silent1566
a078731867 feat(following): add next season action
Verification: FOLLOW-1 SEASON: Following UI source test passes, mobile and leanback compile succeeds, next-season action derives only a new season identity while preserving the old record and is enabled only when latestReleasedSeason advances

Task-Guard: FOLLOW-1-SEASON
2026-09-19 21:35:11 +08:00
Silent1566
197b995e3c feat(following): add filter and feature switch
Verification: FOLLOW-1 UX: Following Ui source unit test passes, mobile+leanback Java compile/package succeeds; device 192.168.50.3:5561 shows and toggles Updates-only filter and user-controlled following scheduler switch

Task-Guard: FOLLOW-1-UX
2026-09-19 21:31:42 +08:00
Silent1566
6a7b3a85bb feat(following): add sync compatibility and alist import
Verification: FOLLOW-1 P5: following unit tests pass, leanback Java compile passes, Deno/Cloudflare/Vercel relay node --check passes, all five serverless normalizers preserve follow, git diff --check passes

Task-Guard: FOLLOW-1-P5
2026-09-19 21:19:00 +08:00
Silent1566
75d3f87342 docs(tmdb): record subscription config root correction
Verification: documentation-only closure: subscription-config-root commit and recovery tag recorded; no build or device test rerun

Task-Guard: C16-config-root-credential-close
2026-09-19 21:13:16 +08:00
Silent1566
b51a3795e9 fix(tmdb): accept key from subscription config root
Verification: git diff --check; 7 targeted JVM classes / 26 tests passed; SM-N9700 Android 9 192.168.50.3:5557 Mobile subscription 5/5 + keyless 3/3, Leanback subscription 5/5 + keyless 3/3; storage scan and logcat found no test key

Task-Guard: C16-config-root-credential
2026-09-19 21:12:54 +08:00
Silent1566
bd4f15581e feat(following): implement core following updates flow
Verification: FOLLOW-1 P0-P4: mobile+leanback targeted unit tests and Java compile pass; mobile arm64 debug APK builds; device 192.168.50.3:5561 launches FollowingActivity, creates following DB/schema, registered WorkManager job, and FollowingDatabaseTest passes

Task-Guard: FOLLOW-1
2026-09-19 21:09:16 +08:00
Silent1566
ceac8d89af docs: promote following to primary navigation entry
Verification: FOLLOW-1 design entry-level docs updated: Mobile menu_nav following between live/setting; Leanback HomeButton id 8 between keep/push; detail and notification entry retained; F-10, P4, UI tests, defaults and checklist synchronized; git diff --check passed; 25 level-2 sections and 80 balanced code fences

Task-Guard: FOLLOW-1-DOC-2
2026-09-19 20:21:52 +08:00
Silent1566
c6b853419b docs(tmdb): close C16 subscription credential implementation
Verification: documentation-only closure: stage 5 commit/tag and final C16 client status recorded; no build or device test rerun

Task-Guard: C16-19-stage5-close
2026-09-19 20:20:14 +08:00
Silent1566
fd593f3d3c test(tmdb): verify subscription credentials on devices
Verification: SM-N9700/Android 9 192.168.50.3:5557; Mobile and Leanback subscription credential device tests 5/5 each; keyless regression 3/3 each; app private storage and logcat scan found no test key; APK SHA-256 recorded in docs

Task-Guard: C16-19-stage5
2026-09-19 20:18:42 +08:00
Silent1566
36fbf2f17f docs: add FOLLOW-1 following updates design
Verification: structure validation: 1633 lines, 25 level-2 sections, 80 balanced code fences, required sections present, no TODO/TBD, git diff --check passed, task_guard scope check passed

Task-Guard: FOLLOW-1
2026-09-19 20:14:03 +08:00
Silent1566
552b68bb8e
Merge pull request #324 from Silent1566/dev4
fix(intro-skip): 同一播放会话仅保留一个确认框
2026-09-19 19:32:02 +08:00
Silent1566
6d98352985 feat: split ad log columns and add per-column filters
Verification: bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.bean.AdBlockLogFilterTest --tests com.fongmi.android.tv.ui.dialog.AdBlockStatsDialogLayoutTest --console=plain (BUILD SUCCESSFUL); XML parse and git diff --check passed

Task-Guard: ad-stats-column-filters-20260919
2026-09-19 19:31:03 +08:00
Silent1566
d2136e4633 test(tmdb): redact and verify transient credentials
Verification: git diff --check; 57 targeted C16 regression tests passed; Mobile and Leanback Arm64_v8aDebug Java compilation BUILD SUCCESSFUL

Task-Guard: C16-19-stage4
2026-09-19 19:28:00 +08:00
Silent1566
73abd0350b feat(tmdb): fill source details by capability gaps
Verification: git diff --check; 19 targeted source-planner/merger/runtime/credential tests passed; Mobile and Leanback Arm64_v8aDebug Java compilation BUILD SUCCESSFUL

Task-Guard: C16-19-stage3
2026-09-19 19:21:19 +08:00
Silent1566
7cc55beae4 feat(tmdb): activate subscription source credentials
Verification: git diff --check; targeted 15 unit tests passed; Mobile and Leanback Arm64_v8aDebug Java compilation BUILD SUCCESSFUL

Task-Guard: C16-19-stage2
2026-09-19 19:14:19 +08:00
Silent1566
a50de802a1 feat(tmdb): scope source credentials to subscription
Verification: git diff --check; :app:testMobileArm64_v8aDebugUnitTest targeted ingress/store/wiring tests: BUILD SUCCESSFUL in 9s, 12 tests passed

Task-Guard: C16-19-stage1
2026-09-19 19:08:29 +08:00
Silent1566
dcfd78749b fix(intro-skip): keep one confirmation dialog per playback session
Verification: bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.player.IntroSkipPlaybackStateTest --tests com.fongmi.android.tv.player.IntroSkipActivityWiringTest --no-daemon --console=plain: BUILD SUCCESSFUL in 1m 4s; 10 tests, 0 failures, 0 errors, 0 skipped; git diff --check passed

Task-Guard: intro-skip-single-confirm-dialog-20260919
2026-09-19 19:02:59 +08:00
Silent1566
638a228b06 docs(tmdb): scope source api key to subscription
Verification: docs-only review: git diff --check passed; subscription-scoped key lifecycle, switch-clear, no-key-empty, A-B-A isolation and epoch anchors validated

Task-Guard: C16-source-tmdb-key-subscription-scope
2026-09-19 19:00:25 +08:00
Silent1566
36116ddef8 docs(tmdb): keep transient source key for process lifetime
Verification: docs-only review: git diff --check passed; process-lifetime credential semantics validated with no TTL and explicit cross-source/subscription retention

Task-Guard: C16-source-tmdb-key-process-lifetime
2026-09-19 18:46:20 +08:00
Silent1566
b2fc89779f docs(tmdb): redesign source api key as transient global
Verification: docs-only review: git diff --check passed; root-level tmdb_api_key, process-global transient TTL store, user-precedence, no-persistence and acceptance anchors validated

Task-Guard: C16-source-tmdb-key-global
2026-09-19 18:40:31 +08:00
Silent1566
8cd2debc28
Merge pull request #323 from Silent1566/dev3
merge: 合并 beta 最新代码并完成 dev3 复评
2026-09-19 18:39:22 +08:00
Silent1566
0e48abdba3 docs(tmdb): design transient source api key handling
Verification: docs-only review: git diff --check passed; C16 sections 19.1-19.18 and assessment index anchors validated

Task-Guard: C16-source-tmdb-key
2026-09-19 18:17:04 +08:00
Silent1566
afff610086 merge: 合并 beta 最新代码并完成 dev3 复评
Verification: git diff --cached --check通过;Mobile Arm64定向JVM测试12类184项failures=0/errors=0/skipped=0;compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL

Task-Guard: beta-sync-review-dev3-20260919-round2
2026-09-19 18:13:56 +08:00
Silent1566
2f057dc32e
Merge pull request #322 from Silent1566/dev2
合并 beta 最新代码并完成 dev2 直播源复评
2026-09-19 18:02:39 +08:00
Silent1566
5e033517e0 merge: 合并 beta 最新代码并完成 dev2 复评
Verification: 合并 origin/beta@10f0b0ab2a 无冲突;相对 beta 仅 16 个直播 fallback 文件;Mobile/Leanback 定向 JVM 测试与 Leanback Java 编译 BUILD SUCCESSFUL;5557 上 adb -s instrumentation 2/2 通过;git diff --check 通过;复评两轮通过

Task-Guard: beta-sync-review-dev2-20260919
2026-09-19 17:58:18 +08:00
Silent1566
fa48fe5f88 fix(tmdb): preserve card-bound episode in long-press detail
Verification: 通过最长按运行时调试确认 Episode.getTmdbEpisode() 为 null,而适配器 tmdbItems 已存在第3集绑定;focused test 与 mobile/leanback 编译通过:git diff --check && bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailActivityLayoutTest --tests com.fongmi.android.tv.ui.dialog.EpisodeDetailDialogThemeTest :app:compileLeanbackArm64_v8aDebugJavaWithJavac --no-daemon => BUILD SUCCESSFUL (1m 3s)

Task-Guard: tmdb-longpress-bound-episode-20260919
2026-09-19 17:40:36 +08:00
Silent1566
10f0b0ab2a
Merge pull request #321 from Silent1566/dev3
feat(tmdb): 支持无 Key 的源内嵌详情离线渲染
2026-09-19 17:01:00 +08:00
Silent1566
7f5379cd73 fix(tmdb): keep keyless source details offline
Verification: Mobile+Leanback定向JVM测试通过;V1923A Android9 Mobile/Leanback设备矩阵各3/3通过;git diff --check通过

Task-Guard: beta-sync-review-dev3-20260919
2026-09-19 16:56:08 +08:00
Silent1566
c2b1907c3b docs(tmdb): close C16 implementation index
Verification: C16 assessment index updated to implemented/verified; links match stage A-F commits, target-device 3/3 results, and full ARM64 unit suites; git diff --check passed

Task-Guard: C16-assessment-close
2026-09-19 16:32:42 +08:00
Silent1566
f585fe06a9 test(tmdb): align keyless network task assertion
Verification: Full Mobile Arm64 and Leanback Arm64 unit suites passed after updating the stale source assertion: BUILD SUCCESSFUL; git diff --check passed

Task-Guard: C16-full-unit-fix
2026-09-19 16:32:19 +08:00
Silent1566
d52fdfc5b2 test(tmdb): verify keyless source detail on target device
Verification: V1923A Android 9 192.168.50.3:5559: Mobile and Leanback C16KeylessSourceDetailDeviceTest each 3/3 passed with 0 failures; complete embedded standalone, complete embedded native-enhanced, and legacy no-key fallback covered; fixture requests limited to config and source detail endpoints; config restored after tests

Task-Guard: C16-stage-F
2026-09-19 16:28:57 +08:00
Silent1566
6e2cde565a fix(tmdb): close keyless source-only UI gaps
Verification: 10 targeted source-only interaction/runtime tests passed; Mobile and Leanback Arm64 Debug Java compilation passed; git diff --check passed

Task-Guard: C16-stage-E
2026-09-19 16:06:01 +08:00
Silent1566
b2343d1d1d feat(tmdb): load native details from source-only data
Verification: 220 targeted Mobile tests passed (VideoActivityRuntimeModeWiringTest=3, TmdbUIAdapterSourceOnlyTest=1, VideoActivityLayoutTest=153, VideoActivityDetailShellSourceTest=4, TmdbUIAdapterTest=59); Mobile and Leanback Arm64 Debug Java compilation passed; git diff --check passed

Task-Guard: C16-stage-D
2026-09-19 16:02:25 +08:00
Silent1566
6a994fa1ac feat(tmdb): route keyless standalone source details
Verification: TmdbDetailSourceOnlyWiringTest=4 passed; Mobile and Leanback Arm64 Debug Java compilation passed; git diff --check passed

Task-Guard: C16-stage-C
2026-09-19 15:55:14 +08:00
Silent1566
5230fbe186 test: verify live source fallback advances one source
Verification: 192.168.50.3:5557 上 Mobile arm64-v8a Debug 的 LiveSourceFallbackInstrumentedTest 2/2 通过:未解析中间源保持当前源且解析成功后 homeIndex=1;无效源只切换到紧邻有效源且 homeIndex=2(第四项为末尾,未跳到末尾)。

Task-Guard: live-source-fallback-device-verification
2026-09-19 15:54:48 +08:00
Silent1566
1c4213db0b feat(tmdb): allow keyless mode and theme settings
Verification: SettingTmdbSourceOnlyWiringTest=3 passed; Mobile and Leanback Arm64 Debug Java compilation passed; git diff --check passed

Task-Guard: C16-stage-B
2026-09-19 15:49:29 +08:00
Silent1566
19128b7d18 feat(tmdb): add keyless runtime detail policies
Verification: Mobile Arm64 unit tests: DetailRuntimeModePolicyTest=4, TmdbSourceAvailabilityTest=7, 0 failures; Leanback Arm64 Debug Java compilation passed; git diff --check passed

Task-Guard: C16-stage-A
2026-09-19 15:32:25 +08:00
Silent1566
0bf950d721 docs: design keyless embedded tmdb detail routing
Verification: git diff --check passed; C16 section 18 anchors and required contract phrases verified; documentation-only change

Task-Guard: C16
2026-09-19 15:22:11 +08:00
Silent1566
ce392002b2 fix: wait for live source parse before fallback
Verification: LiveActivitySourceFallbackSourceTest 在 Mobile arm64-v8a Debug 通过;Mobile/Leanback Java 编译通过;Mobile arm64-v8a Debug APK 构建并安装到 192.168.50.3:5557,补丁版 LiveActivity 可启动并持续播放。

Task-Guard: live-source-fallback-unparsed
2026-09-19 15:22:05 +08:00
Silent1566
ca62fe6f5b
Merge pull request #320 from Silent1566/dev3
优化界面缩放选项并统一多语言映射
2026-09-19 14:55:57 +08:00
Silent1566
145eaba5b2 fix(ui): expand and align interface scale options
Verification: ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.UiScaleContractTest: BUILD SUCCESSFUL; 2 tests, 0 failures; git diff --check passed; all three select_ui_scale arrays contain 9 entries

Task-Guard: UI-SCALE-OPTIONS
2026-09-19 14:48:11 +08:00
Silent1566
6e29d49084 fix: preserve live source fallback state 2026-09-19 14:19:16 +08:00
Silent1566
e5d014ec6b
Merge pull request #319 from Silent1566/dev3
同步 Exo HDR ASS 修复并完成 beta 复评
2026-09-19 13:57:04 +08:00
Silent1566
0875471115 docs: correct beta sync review evidence
Verification: origin/beta..HEAD 全部 3 个未推送提交已逐文件复审;修复并复审验证文档事实,明确设备定向测试为 6 项修复相关通过、1 项既有包名夹具失败;task_guard check、git diff --check、无 unmerged path、arm64 libexo_ass.so manifest SHA-256 校验通过;origin/beta 已是 HEAD 祖先

Task-Guard: C4
2026-09-19 13:49:42 +08:00
Silent1566
6805d67721 merge: synchronize latest fish2018 main updates
Verification: Mobile arm64 Debug+AndroidTest APK BUILD SUCCESSFUL; 6/6 HDR ASS policy/native/blur tests passed on arm64 V1923A; pre-existing AssPlaybackTest package mismatch documented and not changed; libexo_ass.so and provenance SHA-256 matched; upstream main 2623cb812e unchanged

Task-Guard: C4
2026-09-19 13:23:28 +08:00
Silent1566
d889050476
Merge pull request #318 from Silent1566/dev3
修复 TMDB 外部播放返回后的选集同步
2026-09-19 13:10:29 +08:00
Silent1566
280146a47a Merge remote-tracking branch 'origin/beta' into dev3 2026-09-19 13:05:26 +08:00
Silent1566
f51b95e996 fix(tmdb): 返回详情页同步当前播放集
Verification: TmdbDetailActivityLayoutTest 全类通过;Mobile arm64_v8a Debug Java 编译通过;git diff --check 通过

Task-Guard: fix-tmdb-detail-return-episode-20260919
2026-09-19 12:37:16 +08:00
Silent1566
5bdb5b822b
Merge pull request #317 from Silent1566/dev4
merge: 同步 beta 播放器修复并交付 T3/T4 内嵌 TMDB 详情
2026-09-19 12:23:49 +08:00
Silent1566
36b237f2df docs: 收口 beta 合并复评交付记录
Verification: 仅收口已完成的 C17 文档状态;上一合并提交的 Leanback 编译与 14 组定向测试已通过,PR #317 已确认 OPEN/MERGEABLE,git pull --ff-only 为 up to date。

Task-Guard: C17-beta-sync-review-dev4-20260919-closure
2026-09-19 12:21:43 +08:00
Silent1566
5acd3f0841 merge: 合并 beta 最新播放器与 Leanback 修复
Verification: Leanback Arm64 编译通过;14 组 C16/TMDB、广告统计布局、预加载与播放器定向测试通过;两轮复评无未合并路径、冲突标记、越界文件或二进制变更。

Task-Guard: C17-beta-sync-review-dev4-20260919
2026-09-19 12:20:49 +08:00
Silent1566
da00b7a1f2
Merge pull request #316 from Silent1566/dev3
feat(leanback): 优化广告统计对话框电视端交互
2026-09-19 11:48:22 +08:00
Silent1566
c4fd5acd74 docs(tmdb): finalize implementation status
Verification: Recovery anchor scope now matches completed C16 stages 1-6; documentation diff check and task guard passed

Task-Guard: C16-doc-final
2026-09-19 11:45:37 +08:00
Silent1566
38cb3ed2e7 test(tmdb): gate device fixture verification
Verification: C16 device instrumentation test now skips unless Config.vod is the explicit 127.0.0.1:18080 fixture; mobile AndroidTest APK rebuild BUILD SUCCESSFUL

Task-Guard: C16-stage6-test-guard
2026-09-19 11:45:18 +08:00
Silent1566
31b981bc82 test(tmdb): verify source detail contract on device
Verification: HD1910 Android 9 emulator 5561: Mobile and Leanback each passed complete T4, partial T4, complete T3 and legacy source instrumentation tests; Leanback complete TV season/episode test passed with no season/episode TMDB request; fixture data restored

Task-Guard: C16-stage6-device
2026-09-19 11:44:01 +08:00
Silent1566
93c2413b02 feat(leanback): 优化广告统计对话框电视端交互
Verification: Leanback arm64_v8a Debug Java 编译通过;定向回归测试 PreCachePolicyTest、ReaderPlaybackRoutingSourceTest、ExoCompressedAudioDirectPolicyTest、ExoAudioOutputStateTest 通过;git diff --check 与 task_guard check 通过;复评确认 TabLayout 焦点时序与父级焦点修复

Task-Guard: beta-pr-review-dev3-20260919
2026-09-19 11:43:32 +08:00
Silent1566
89987a803f feat(tmdb): use embedded delayed detail capabilities
Verification: 203 focused tests passed including embedded season/episode/video shortcuts and source priority; Leanback Arm64 debug Java compile BUILD SUCCESSFUL

Task-Guard: C16-stage5
2026-09-19 11:21:46 +08:00
Silent1566
7de6bed888 feat(tmdb): apply source payload before tmdb detail requests
Verification: 75 focused tests passed (source payload, generation, cache key, adapter, activity layout, UI adapter); Leanback Arm64 debug Java compile BUILD SUCCESSFUL

Task-Guard: C16-stage4
2026-09-19 11:13:03 +08:00
Silent1566
070efd6f4e test(tmdb): cover t3 t4 source detail cache contract
Verification: SiteApiT3TmdbDetailTest + SiteApiT4TmdbDetailTest: 4 tests passed; mobile arm64 debug unit test task BUILD SUCCESSFUL

Task-Guard: C16-stage3
2026-09-19 10:59:28 +08:00
Silent1566
bbd0a4de5f feat(tmdb): add source payload adaptation and merge logic
Verification: TmdbSourceAdapterTest + TmdbSourceCapabilityPlannerTest + TmdbSourceMergerTest: 10 tests passed; Leanback Arm64 debug Java compile and mobile unit test task BUILD SUCCESSFUL after fixing parser array-element recursion

Task-Guard: C16-stage2
2026-09-19 10:57:29 +08:00
Silent1566
4865bd7ad0 feat(tmdb): add source detail protocol model
Verification: TmdbSourcePayloadTest + VodTmdbParcelableTest: 7 tests passed; mobile unit test task and Leanback Arm64 debug Java compilation both BUILD SUCCESSFUL

Task-Guard: C16-stage1
2026-09-19 10:43:02 +08:00
Silent1566
a89741667a docs: add tmdb implementation specification
Verification: C16 implementation specification expanded with exact WebHTV files/classes,先源后网 detail state machine, fixed payload fields and JSON examples, capability-to-TmdbService mapping, season-aware cache/source rules, T3/T4 server boundary, Parcelable/XML compatibility, tests, and staged implementation; git diff --check and task_guard check passed

Task-Guard: C16-tmdb-source-detail
2026-09-19 10:29:31 +08:00
Silent1566
c73fbeee08 docs: assess alist tvbox and atv player for tmdb contract
Verification: C16 design updated with fixed-source analysis of alist-tvbox@8a222f69a80291e836db702c34daf1ed5bdd5630 and atv-player@09feed1d5e5102f13bf91c9fbb76ea92808cb76d; season-aware protocol/cache decisions, source evidence, git diff --check, untracked document whitespace/encoding checks, and task_guard check passed

Task-Guard: C16-tmdb-source-detail
2026-09-19 10:04:37 +08:00
www.xueximeng.com
2623cb812e fix(exo): preserve ASS styling over HDR video
Verification: Mobile ARM64 debug and test APK build passed (2m33s); 7 focused device tests passed (7.185s); native/APK provenance, API24, 16KiB and JNI linkage checks passed; user accepted the repaired subtitles and explicitly requested the recovery tag.

Task-Guard: E4-LIBASS-hdr-fix-20260919
2026-09-19 09:30:14 +08:00
www.xueximeng.com
e85dc87988 docs(exo): diagnose HDR SSA style fallback and bound the fix
Verification: Assessment documents only: scoped git diff --check passed; verify_upstream_checkpoint.sh passed with 0 errors and 0 warnings; no production code or binary changes, original HDR/DV playback still pending device unlock.

Task-Guard: E4-LIBASS-hdr-review-20260919
2026-09-19 08:27:10 +08:00
Silent1566
837847cb85
Merge pull request #315 from Silent1566/dev3
同步 beta 最新代码并保留播放启播/预加载修复
2026-09-18 23:47:01 +08:00
Silent1566
e87161fdd9 merge: 同步 beta 最新代码并保留播放修复
Verification: Leanback arm64 Debug Java 编译通过;PreCachePolicyTest、ReaderPlaybackRoutingSourceTest、ExoCompressedAudioDirectPolicyTest、ExoAudioOutputStateTest 通过;git diff --check 与 task_guard check 通过

Task-Guard: beta-sync-review-dev3-20260918-r2
2026-09-18 23:44:18 +08:00
Silent1566
fe88163cf7 fix(player): 节流预加载任务突发
Verification: PreCachePolicyTest 在 leanbackArm64_v8aDebug 通过;Leanback arm64 Debug APK 构建并安装成功;192.168.50.3:5559 最终复测中预加载 task-start 仅 4 次,相邻最小间隔 5.5 秒,rebufferStart=0、engineRebuild=0、PlaybackException/FATAL=0,VideoActivity 前台播放且进度持续推进;task_guard check 与 git diff --check 通过

Task-Guard: fix-precache-task-burst-20260918
2026-09-18 23:36:31 +08:00
Silent1566
32a52698e5
Merge pull request #314 from Silent1566/dev4
同步 fish2018/main 最新上游并完成 beta 集成复审
2026-09-18 23:33:11 +08:00
Silent1566
36a9934414 fix(build): 去重合并后的测试依赖配置
Verification: androidx.test:runner 1.7.0 dependency resolution passed; Mobile and Leanback arm64-v8a Debug Java compilation BUILD SUCCESSFUL; git diff --check passed; second review found no remaining merge issue

Task-Guard: beta-sync-review-dev4-20260918
2026-09-18 23:31:07 +08:00
Silent1566
710e1bd520 merge: synchronize latest fish2018 main updates
Verification: Mobile/Leanback arm64 Debug Java compile; Mobile arm64 Debug unit tests 4587 tests, 0 failures, 0 errors, 1 skipped; verify_mpv_native_assets.sh --require-elf passed for arm64-v8a and armeabi-v7a; no conflict markers; staged diff check passed

Task-Guard: C4
2026-09-18 23:02:00 +08:00
Silent1566
96ab4c2ebb fix: fallback when live source parsing fails
Verification: 直播源列表解析失败时,Mobile 与 Leanback 均会在自动切源开启时进入既有 startFlow 回退策略;LiveActivityLayoutTest 与 LiveSourceFallbackPolicyTest 在 Mobile 和 Leanback arm64-v8a Debug 变体均通过;两个变体的 Java 编译成功;git diff --check 与 task_guard check 均通过。

Task-Guard: live-source-parse-failure-fallback
2026-09-18 22:24:13 +08:00
Silent1566
39a5f783e9 fix(player): 避免启播阶段重复重建和缓冲
Verification: Leanback arm64 定向单元测试通过;Leanback arm64 Debug APK 编译并安装成功;192.168.50.3:5559 实机复现后 VideoActivity 持续前台播放,engineRebuild=0、rebufferStart=0、PlaybackException/FATAL=0;task_guard check 与 git diff --check 通过

Task-Guard: fix-duplicate-playback-start-20260918
2026-09-18 21:41:24 +08:00
Silent1566
71cdddca31 fix: bypass player retries for live source fallback
Verification: Mobile 与 Leanback arm64-v8a Debug 的 LiveActivityLayoutTest 和 LiveSourceFallbackPolicyTest 均通过;两个变体的 Java 编译均成功;启用直播源自动回退时,HTTP 源错误会直接进入直播回退流程,避免播放器内部重复重试阻塞切源;设置关闭时保留原播放器重试链;git diff --check 与 task_guard check 均通过。

Task-Guard: live-source-fallback-bypass-player-retries
2026-09-18 21:13:51 +08:00
Silent1566
ac39115dd9
Merge pull request #313 from Silent1566/dev4
feat(subtitle): 支持 T3 Python 字幕源与独立环境配置
2026-09-18 20:39:50 +08:00
Silent1566
b8375e6831 docs(subtitle): document subtitle source protocol
Verification: 协议设计文档非空、包含一级标题且 git diff --check 通过

Task-Guard: subtitle-source-protocol-doc
2026-09-18 20:34:09 +08:00
Silent1566
0b6e58a1d0 fix(subtitle): refresh provider environment from template
Verification: 字幕相关单元测试与 :app:compileLeanbackArm64_v8aDebugJavaWithJavac 通过,BUILD SUCCESSFUL

Task-Guard: subtitle-source-env-refresh
2026-09-18 20:30:17 +08:00
Silent1566
d74ebab009 fix(subtitle): avoid regex crash in environment placeholders
Verification: SubtitleSourceEnvironmentTest 与 :app:compileLeanbackArm64_v8aDebugJavaWithJavac 通过,BUILD SUCCESSFUL

Task-Guard: subtitle-source-regex-crash
2026-09-18 20:29:23 +08:00
Silent1566
7386573f12 Merge remote-tracking branch 'origin/beta' into dev4 2026-09-18 20:16:14 +08:00
Silent1566
8cde0eaa62 fix: initialize live config from runtime state
Verification: Mobile 与 Leanback arm64-v8a Debug 的 LiveActivityLayoutTest 和 LiveSourceFallbackPolicyTest 均通过;两个变体的 Java 编译均成功;checkLive 现在依据 LiveConfig 的实际运行时状态决定是否初始化并加载配置;git diff --check 与 task_guard check 均通过。

Task-Guard: live-config-runtime-init-fix
2026-09-18 20:07:19 +08:00
Silent1566
8a4fc98e8a fix: cancel stale live fallback timeout on error
Verification: Mobile 与 Leanback arm64-v8a Debug 的 LiveActivityLayoutTest 和 LiveSourceFallbackPolicyTest 均通过;两个变体的 Java 编译均成功;播放错误处理会在执行回退前取消遗留的缓冲超时回调;git diff --check 与 task_guard check 均通过。

Task-Guard: live-source-fallback-timeout-cancel
2026-09-18 19:35:45 +08:00
Silent1566
62581cdebc feat: add per-source subtitle environment settings
Verification: Mobile/Leanback arm64 debug Java compilation succeeded; SubtitleSourceEnvironmentTest passed; subtitle source list and per-source environment APIs compiled; git diff --check and task_guard check passed

Task-Guard: subtitle-source-list-per-env
2026-09-18 19:31:26 +08:00
Silent1566
6e1afaae89 test: cover live source fallback policy
Verification: 直播源回退策略单元测试在 Mobile 与 Leanback arm64-v8a Debug 变体均通过;LiveActivityLayoutTest 在两个变体均通过;Leanback 与 Mobile arm64-v8a Debug Java 编译成功;git diff --check 通过;task_guard check 通过。

Task-Guard: live-source-fallback-policy-test
2026-09-18 19:26:30 +08:00
Silent1566
1c2948140a fix: fallback to next live line after source exhaustion
Verification: Leanback 与 Mobile arm64-v8a Debug Java 编译成功;Mobile arm64-v8a Debug APK 构建成功并安装到 192.168.50.3:5557;com.silent.android.webhtv 可启动且 LiveActivity 保持前台运行;task_guard check 通过;git diff --check 通过。由于设备当前未加载可触发故障的直播配置,本轮未伪称完成真实直播线路故障注入。

Task-Guard: live-source-fallback-fix
2026-09-18 19:20:34 +08:00
Silent1566
8d7be25eab feat: integrate subtitle source settings and environment
Verification: Mobile/Leanback arm64 debug Java compilation succeeded; SubtitleSourceEnvironmentTest passed; git diff --check and task_guard check passed

Task-Guard: subtitle-source-ui-env
2026-09-18 19:02:12 +08:00
Silent1566
0ce10e8ebf fix(live): 自动切换失效直播源
Verification: Leanback 与 Mobile Java 编译通过;Leanback arm64-v8a APK 构建及安装成功;本地与设备 APK SHA-256 一致;192.168.50.3:5557 上 LiveActivity 持续阻塞场景已检查;Gradle 资源已释放

Task-Guard: LIVE-SOURCE-FALLBACK-5575-20260918
2026-09-18 17:32:20 +08:00
Silent1566
533d3bf18d
Merge pull request #312 from Silent1566/dev3
fix: close beta sync review findings
2026-09-18 17:16:18 +08:00
www.xueximeng.com
88aceb1109 fix(ci): skip obsolete Android SDK tools package
Verification: GitHub Actions run 35322116734 failed installing obsolete tools; upstream action.yml confirms packages input; Ruby YAML parse and full workflow semantic comparison passed, with packages=platform-tools as the only change. Remote workflow has not been rerun.

Task-Guard: RELEASE-SDK-TOOLS-20260918
2026-09-18 17:15:45 +08:00
Silent1566
a03cbd20e3 fix: close beta sync review findings
Verification: Mobile and Leanback arm64-v8a focused unit tests passed; git diff --check passed; task_guard check passed; replacement-character scan passed

Task-Guard: beta-sync-review-dev3-20260918
2026-09-18 17:07:15 +08:00
Silent1566
5791c9c713 Merge remote-tracking branch 'origin/beta' into dev3 2026-09-18 16:33:08 +08:00
Silent1566
2fa1e6f36d fix(site-health): 补齐 TMDB 详情播放统计
Verification: git diff --check;task_guard check;:app:testLeanbackArm64_v8aDebugUnitTest 与 :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.SiteHealthReportSourceTest(BUILD SUCCESSFUL)

Task-Guard: site-health-tmdb-detail-playback
2026-09-18 15:58:49 +08:00
Silent1566
2a31e629f6 feat(subtitle): migrate built-in providers to T3 Python sources
Verification: :app:testLeanbackArm64_v8aDebugUnitTest --tests 'com.fongmi.android.tv.subtitle.*' (69 tests, 0 failures); Python built-in syntax/manifest contract checks; task_guard check and git diff --check passed

Task-Guard: subtitle-source-protocol-python-builtins
2026-09-18 15:27:43 +08:00
Silent1566
3fc7740dc7 fix(site-health): 独立统计播放尝试次数
Verification: git diff --check;task_guard check;:app:testLeanbackArm64_v8aDebugUnitTest 与 :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.SiteHealthReportSourceTest --no-parallel(BUILD SUCCESSFUL)

Task-Guard: site-health-play-attempt-count
2026-09-18 15:16:25 +08:00
Silent1566
82819156ec test(site-health): 覆盖回退耗尽后的终态错误
Verification: git diff --check;task_guard check;:app:testLeanbackArm64_v8aDebugUnitTest 与 :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.SiteHealthReportSourceTest --no-parallel(BUILD SUCCESSFUL)

Task-Guard: site-health-terminal-fallback-failure
2026-09-18 14:49:24 +08:00
www.xueximeng.com
ee216d8ba7 fix(exo): preserve audio output ownership and tunneling after seek
Verification: Mobile ARM64 Java compilation and 25 focused JVM tests passed (7 output lifecycle, 13 direct/tunneling, 5 network eligibility); JDK 21; log /private/tmp/webhtv-E11-seek-output-verification/gradle-fixed.log; affected-device seek not available

Task-Guard: E11-seek-output-consistency
2026-09-18 14:22:17 +08:00
Silent1566
be1e599178 fix(site-health): 记录最终播放重载失败
Verification: git diff --check;task_guard check;:app:testLeanbackArm64_v8aDebugUnitTest 与 :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.SiteHealthReportSourceTest --no-parallel(BUILD SUCCESSFUL)

Task-Guard: site-health-play-failure-recording
2026-09-18 14:20:53 +08:00
Silent1566
272639738a fix(site-health): 桥接 Exo 首帧健康统计回调
Verification: git diff --check;task_guard check;:app:testLeanbackArm64_v8aDebugUnitTest 与 :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.SiteHealthReportSourceTest(BUILD SUCCESSFUL)

Task-Guard: site-health-first-frame-bridge
2026-09-18 13:57:48 +08:00
Silent1566
5718a66027
Merge pull request #311 from Silent1566/dev2
合并 beta 最新代码并完成 dev2 广告拦截复评
2026-09-18 13:27:54 +08:00
Silent1566
5bef0340a0 Merge remote-tracking branch 'origin/beta' into dev2 2026-09-18 13:22:27 +08:00
Silent1566
0a6bd1bd5d fix(site-health): 首帧渲染后记录播放成功
Verification: git diff --check;task_guard check;:app:testLeanbackArm64_v8aDebugUnitTest 与 :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.SiteHealthReportSourceTest(BUILD SUCCESSFUL)

Task-Guard: site-health-play-first-frame
2026-09-18 13:15:58 +08:00
Silent1566
097547f22b fix(ad): show resolved rule names in site health report
Verification: Leanback arm64-v8a 定向单元测试 SiteHealthReportDialogSourceTest 通过;git diff --check 与 task_guard check 通过

Task-Guard: AD-STATS-RULE-DISPLAY-NAME-20260918
2026-09-18 13:00:34 +08:00
Silent1566
3c34f008d2 feat(site-health): 覆盖首页与分类协议阶段统计
Verification: git diff --check;task_guard check;:app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.SiteHealthReportSourceTest(BUILD SUCCESSFUL)

Task-Guard: site-health-all-protocol-stages
2026-09-18 12:51:00 +08:00
Silent1566
791b3fa27c fix(hls): restore legacy fallback without configured rules
Verification: Leanback arm64-v8a 定向单元测试通过��;设备 192.168.50.3:5557 持久化统计已确认 v.lfthirtytwo.com 由 hls.legacy-fallback 实际拦截 28 个切片;git diff --check 与 task_guard check 通过

Task-Guard: HLS-ADBLOCK-LFTHIRTYTWO-REGRESSION-20260918
2026-09-18 12:49:15 +08:00
Silent1566
937a6a2996 feat(site-health): 增强健康报表筛选与播放统计
Verification: git diff --check;task_guard check;:app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.SiteHealthReportSourceTest(BUILD SUCCESSFUL)

Task-Guard: site-health-report-expansion
2026-09-18 12:38:16 +08:00
www.xueximeng.com
ad6f68d512 feat(exo): support independently selected dual subtitles
Verification: 13 focused Android/Media3 checks passed, including real dual TextRenderer and ExoPlayer/MediaPeriod/View lifecycle; mobile ARM64 Release/Debug/test APK and Leanback ARMv7 Java build passed; APK DEX and unchanged ASS JNI verified; checkpoint 0 errors/0 warnings. No ADB device: native ASS coexistence and physical playback remain unverified. Evidence: docs/E4-LIBASS-exo-ass-rendering.md sections 16.4-16.5.

Task-Guard: E4-LIBASS-dual-subtitles
2026-09-18 12:33:12 +08:00
Silent1566
3d325264b6
Merge pull request #310 from Silent1566/dev3
优化站点健康报表窗口尺寸
2026-09-18 11:56:23 +08:00
Silent1566
b1f006d622 fix(site-health): 优化健康报表窗口尺寸
Verification: :app:testMobileArm64_v8aDebugUnitTest(SiteHealthReportSourceTest、CrashActivityDetailsTest)BUILD SUCCESSFUL;git diff --check 通过;两轮代码评审通过

Task-Guard: beta-sync-review-dev3-20260918
2026-09-18 11:52:15 +08:00
Silent1566
58f53536fd
Merge pull request #309 from Silent1566/dev4
修复前台崩溃恢复页面并完成 beta 同步评审
2026-09-18 11:09:00 +08:00
Silent1566
0323586e70 fix(crash): restore foreground recovery screen
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.CrashActivityDetailsTest(BUILD SUCCESSFUL);git diff --check;复评通过

Task-Guard: dev4-crash-foreground-recovery-review-20260918
2026-09-18 11:03:33 +08:00
Silent1566
e6227ca39a
Merge pull request #308 from Silent1566/dev3
修复移动端短剧播放控制按钮点击事件
2026-09-18 11:01:53 +08:00
Silent1566
d014ea2a21 fix(mobile): restore short-drama episode dock click
Verification: bash ./gradlew :app:compileMobileArm64_v8aDebugJavaWithJavac (BUILD SUCCESSFUL); git diff --check

Task-Guard: SHORT-DRAMA-EPISODE-CLICK-20260918
2026-09-18 10:20:15 +08:00
Silent1566
c70fb7e4bb
Merge pull request #306 from Silent1566/dev3
同步 beta 并加固崩溃静默重启
2026-09-18 10:08:04 +08:00
Silent1566
b50a93571c
Merge pull request #307 from Silent1566/dev4
修复:限制 Exo 缓冲停滞看门狗作用范围
2026-09-18 10:06:36 +08:00
Silent1566
cda62f3965 Merge remote-tracking branch 'origin/beta' into dev4 2026-09-18 09:52:00 +08:00
www.xueximeng.com
e2f39f2407 perf(exo): skip fixed-track constraint reselection and reuse codec diagnostics
Verification: 32 focused tests passed (16 automatic constraint policy, 8 snapshot cache including concurrency, 8 applicability); real log35 replay 18 queries: 222 candidate events -> 56; TV armeabi-v7a fast Release built in 3m12s, ZIP/ABI entries/signature passed, SHA256 8df919f2188530913f8a3adaf833ab27133afc22ef6339a4da2e8baea4fd4525. Evidence build/avdiag-exo-reselect/. Target TV playback performance remains for same-clip online-log comparison.

Task-Guard: AV-DIAG-01-EXO-RESELECT
2026-09-18 07:18:47 +08:00
www.xueximeng.com
4818057cd6 fix(diagnostics): base audio conclusions on observed output state
Verification: Mobile arm64 Java compilation passed in 38s (39 tasks: 2 executed, 37 up-to-date); git diff --check passed; evidence build/avdiag-audio-hint/compile.log. No APK install or device playback validation.

Task-Guard: AV-DIAG-01-AUDIO-HINT
2026-09-18 06:07:42 +08:00
Silent1566
72241b8937 merge: 同步 beta 并加固崩溃静默重启
Verification: 定向 CrashActivityDetailsTest 通过(BUILD SUCCESSFUL);git diff --check 与 git diff --cached --check 通过;task_guard check 通过

Task-Guard: dev3-beta-sync-review-20260918
2026-09-18 01:35:33 +08:00
Silent1566
8fbf79caf4 fix(ad): show custom rule names in block logs
Verification: :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.api.config.HlsRuleConfigTest --no-daemon: BUILD SUCCESSFUL; git diff --check: passed

Task-Guard: AD-BLOCK-CUSTOM-RULE-NAME-20260918
2026-09-18 01:32:01 +08:00
Silent1566
60ad0d0969 fix(player): restrict buffering stall watchdog to Exo
Verification: git diff --check passed; PlayerManagerLifecycleSourceTest and ExoBufferingStallWatchdogTest passed via :app:testMobileArm64_v8aDebugUnitTest; :app:compileLeanbackArm64_v8aDebugJavaWithJavac passed; Gradle daemons stopped

Task-Guard: EXO-BUFFERING-WATCHDOG-SCOPE
2026-09-18 01:01:28 +08:00
www.xueximeng.com
623b069261 fix(mpv): honor HLS media roles for playlist-named live segments
Verification: 19 focused HLS tests passed; Mobile ARM64 Debug build 56s and fast Release build 2m30s passed; Release APK SHA 37ead8e3a5a986b669b032e386f2ec94134b7285edb89630585c00aec91b7863 verified on vivo V2453A; CCTV5 AV3A live MPV playback beyond 381s, video visible, MediaCodec H264 and AV3A PCM 48kHz, segment HTTP 200 with Range preserved, AudioTrack 2516 writes/0 errors; native variant evidence and independent Debug source-plugin JNI failure recorded in docs/P11-mpv-live-av3a.md

Task-Guard: P11-mpv-live-av3a
2026-09-18 00:30:50 +08:00
Silent1566
1c55fcb219
Merge pull request #305 from Silent1566/dev2
修复:移除移动端播放器重复弹幕入口
2026-09-18 00:09:24 +08:00
Silent1566
6041bcf353 Merge remote-tracking branch 'origin/beta' into dev2 2026-09-17 23:59:02 +08:00
Silent1566
847e461be8
Merge pull request #304 from Silent1566/dev4
feat(ad): 增强广告切片验证与预览能力
2026-09-17 23:53:25 +08:00
Silent1566
d8b0cf4990 fix(mobile): 移除播放器重复弹幕入口
Verification: 已同步并确认 origin/beta=f2c38bdef6;完成已提交 HLS 规则改动及移动端弹幕控件改动的两轮评审;:app:testMobileArm64_v8aDebugUnitTest 定向覆盖 VideoActivityLayoutTest、HlsRuleConfigTest、HlsManifestCleanerTest、HlsAdblockPipelineTest、HlsAdRuleTest,共 175 个测试通过;Mobile arm64-v8a Debug 主代码与测试代码编译通过;git diff --check、悬空引用检查和 task_guard check 通过

Task-Guard: REVIEW-DEV2-BETA-UI-20260917
2026-09-17 23:52:49 +08:00
Silent1566
70306f1dec revert: remove ad segment verification
Verification: :app:assembleLeanbackArm64_v8aDebug BUILD SUCCESSFUL

Task-Guard: remove-ad-block-segment-verification-20260917
2026-09-17 23:38:41 +08:00
Silent1566
0db841c43b feat: add silent restart after crash
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.CrashActivityDetailsTest (BUILD SUCCESSFUL); git diff --check; task_guard check

Task-Guard: crash-silent-restart
2026-09-17 23:21:02 +08:00
www.xueximeng.com
18ccd0785f fix(live): expose playback parameters on mobile and TV controls
Verification: Mobile ARM64 APK build and Leanback ARM64 Java/resources compilation passed; 50 native entries unchanged; user confirmed 播放参数面板有了 and requested tag; device automation inconclusive, no additional verification after acceptance

Task-Guard: AV-DIAG-01-live-params
2026-09-17 23:15:08 +08:00
Silent1566
c30fcb7fb9 merge: 合并 beta 最新代码以复评 dev4 改动 2026-09-17 22:08:43 +08:00
Silent1566
f2c38bdef6
Merge pull request #303 from Silent1566/dev2
修复:将旧版规则应用于 HLS 清单
2026-09-17 22:00:27 +08:00
Silent1566
db7856614d fix(ad): apply legacy rules to HLS manifests
Verification: origin/beta 已同步;:app:testLeanbackArm64_v8aDebugUnitTest 聚焦运行 HlsRuleConfigTest 与 CatWebWiringTest 并通过;受影响 Leanback arm64-v8a Debug 主代码和单元测试编译通过;git diff --check 通过;两轮差异评审通过

Task-Guard: REVIEW-DEV2-BETA-20260917
2026-09-17 21:54:11 +08:00
Silent1566
febdcf3612 fix: expose ad segment verification columns
Verification: mobileArm64_v8a debug APK built and installed successfully; mobile and leanback dialog XML parsed successfully; git diff --check passed; Gradle daemons stopped

Task-Guard: ad-block-log-verification-visibility-20260917
2026-09-17 21:34:37 +08:00
www.xueximeng.com
8dd32cb9aa fix(mpv): clip smart ads before rendering and restore reused surfaces
Verification: 25 targeted ad tests and 4 Surface lifecycle tests passed; Mobile ARM64 APK built and installed; fixture 661 blue-to-green frames with zero ad frames; original URL native clip 496301ms -> 512786ms and playback continued; 50 native entries unchanged; user confirmed 看起来正常了

Task-Guard: P10-ad-frame-boundary
2026-09-17 21:11:57 +08:00
Silent1566
bc44a71564
Merge pull request #302 from Silent1566/dev2
移除实验性内置广告拦截规则并强化资源契约测试
2026-09-17 21:06:45 +08:00
Silent1566
71044c8309 test(ad): strengthen empty built-in HLS package contract
Verification: origin/beta 已同步;真实变体 :app:testLeanbackArm64_v8aDebugUnitTest 聚焦通过 BuiltinHlsRuleFixtureTest、HlsRulePackageTest、SpeechAdConfigTest、SpeechAdRuleCodecTest、SpeechAdSettingSourceTest;hls_rules.json JSON 校验通过;实验 HLS 规则残留检查通过;git diff --check 通过;最终评审通过

Task-Guard: REVIEW-DEV2-BETA-20260917
2026-09-17 20:58:45 +08:00
Silent1566
8674466146
Merge pull request #301 from Silent1566/dev3
修复无可播放线路详情被缓存的问题
2026-09-17 20:58:19 +08:00
Silent1566
a826fc0a56 fix: avoid caching details without playable content
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.web.CatWebWiringTest --tests com.fongmi.android.tv.ui.dialog.SiteDialogSelectionScrollSourceTest (BUILD SUCCESSFUL); git diff --check; task_guard check

Task-Guard: dev3-beta-sync-review-20260917
2026-09-17 20:55:44 +08:00
Silent1566
abd8d48fba feat: add HLS ad segment verification playback
Verification: Mobile and Leanback Java compilation passed; full Mobile and Leanback unit test suites passed; UTF-8 replacement-character scan passed; whitespace diff check passed; task guard safety check passed

Task-Guard: ad-block-segment-verification-20260917
2026-09-17 20:26:07 +08:00
www.xueximeng.com
76a78c3439 fix(mpv): preserve programme blocks in HLS ad skip timelines
Verification: 22 focused tests passed (21 initial plus corrected Android-stub fixture); Mobile ARM64 APK built and installed; 50 native entries unchanged; phone original HLS reports corrected ad cuts and backward seek position 488311ms; user accepted current fix and requested tag; ad-frame flash remains a separate optimization

Task-Guard: P10-ad-seek-timeline
2026-09-17 20:11:13 +08:00
Silent1566
2ea862ed60 fix(ad): remove experimental built-in HLS rules
Verification: Removed the three experimental built-in HLS interception rules from app/src/main/assets/rules/hls_rules.json; updated BuiltinHlsRuleFixtureTest to assert that the built-in HLS package is empty; restored the unrelated speech-ad rules removed by the earlier mistaken change; focused BuiltinHlsRuleFixtureTest, HlsRulePackageTest, SpeechAdConfigTest, SpeechAdRuleCodecTest, and SpeechAdSettingSourceTest passed; Gradle BUILD SUCCESSFUL in 33s; static absence assertions, git diff --check, and task guard check passed.

Task-Guard: CORRECT-EXPERIMENTAL-HLS-RULE-REMOVAL
2026-09-17 20:04:40 +08:00
Silent1566
d00dcec415 fix(ad): remove experimental built-in speech rules
Verification: Removed all executable entries from app/src/main/res/raw/speech_ad_rules_v1.txt while retaining the format header; targeted SpeechAdConfigTest, SpeechAdRuleCodecTest, and SpeechAdSettingSourceTest passed via :app:testLeanbackArm64_v8aDebugUnitTest; Gradle BUILD SUCCESSFUL; git diff --check passed.

Task-Guard: REMOVE-EXPERIMENTAL-INTERCEPTION-RULES
2026-09-17 19:54:22 +08:00
Silent1566
701c8b8100
Merge pull request #300 from Silent1566/dev2
修复站点分组切换后的选中项定位
2026-09-17 19:45:38 +08:00
Silent1566
41cac0bee3 fix(site): keep selected site visible after group changes
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.dialog.SiteDialogSelectionScrollSourceTest (BUILD SUCCESSFUL); git diff --check; task_guard check

Task-Guard: site-dialog-group-scroll-selected
2026-09-17 19:27:14 +08:00
www.xueximeng.com
98a7f9033d feat(mpv): add hardware-only AVS3 MediaCodec decoding
Verification: AVS3 production-function ASan/UBSan; fixed FFmpeg plus 7-patch byte equivalence; both ARM codec builds, ELF/16KB/178 public exports; 9 targeted Java tests; Mobile ARM64 APK native identity; actual Android JNI/NDK no-hardware and explicit-context rejection. Positive AVS3 hardware playback remains device-dependent and unverified.

Task-Guard: C-AVS3-mpv-mediacodec
2026-09-17 19:24:36 +08:00
Silent1566
c080271220
Merge pull request #299 from Silent1566/dev2
修复详情页海报圆角并优化直播放映 TMDB 区块间距
2026-09-17 19:11:26 +08:00
Silent1566
e8f18a97c3 fix: compact direct-play TMDB section spacing
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailActivityLayoutTest (BUILD SUCCESSFUL); git diff --check; task_guard check

Task-Guard: tmdb-direct-play-compact-section-spacing
2026-09-17 18:42:40 +08:00
Silent1566
69b0d41529
Merge pull request #298 from Silent1566/dev3
修复详情页海报圆角裁剪并同步 beta
2026-09-17 18:19:47 +08:00
Silent1566
7f905b090d Merge remote-tracking branch 'origin/beta' into dev3 2026-09-17 18:12:16 +08:00
Silent1566
2543660139
Merge pull request #297 from Silent1566/dev2
合并 beta 最新代码并同步播放与 TMDB 改进
2026-09-17 18:08:40 +08:00
www.xueximeng.com
13053755ea fix(mpv): defer resume seek until file loading completes
Verification: Reviewed the focused diff and existing lifecycle paths: pre-load seeks now retain only the latest target and return; FILE_LOADED consumes it once or honors loadfile start; already-loaded seeks and stop/replacement cleanup are preserved. Tests and builds intentionally not run at the user request for a quick source fix.

Task-Guard: C-AVS3-resume-seek
2026-09-17 18:08:27 +08:00
www.xueximeng.com
edf4324034 feat(player): decode AVS3 High 10-bit with isolated HPM backend
Verification: Final dual-player dual-ARM codec artifact/ELF/namespace/license checks and APK 19-entry match passed; oracle 128 frames, interleaved instances/flush, ASan, MP4 PTS/seek and baseline 8/10-bit passed; phone Exo and MPV codecs each match original 128-frame SHA256 e3b317e5ea200e571184985c070b5c27d569c6e317ed145e85bab830aca04452; installed APK 1538aa22ec3daed088facd91daeb68e75b5af2e3e2dbb2b4e82968d88b9ae37e; MPV App first frame observed; user accepts software performance limit and requests closure; no real-time 4K50 claim

Task-Guard: C-AVS3-hpm15
2026-09-17 17:51:03 +08:00
Silent1566
0fc274742e feat: sync beta playback and TMDB improvements 2026-09-17 17:20:10 +08:00
Silent1566
9763e63638 fix: show ad segment times as player clocks
Verification: Gradle BUILD SUCCESSFUL: AdBlockTimeFormatterTest plus mobile unit-test compilation and compileLeanbackArm64_v8aDebugJavaWithJavac

Task-Guard: ad-block-log-player-time-20260917
2026-09-17 16:55:33 +08:00
Silent1566
eebf3514dc feat: test OMDb ratings API latency
Verification: ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.service.TmdbConfigTestServiceTest --tests com.fongmi.android.tv.ui.dialog.TmdbSourceDialogLayoutTest (BUILD SUCCESSFUL in 19s); XML parse passed for values/strings.xml, values-zh-rCN/strings.xml, values-zh-rTW/strings.xml

Task-Guard: tmdb-source-config-test-omdb-latency
2026-09-17 16:10:31 +08:00
Silent1566
89f3c701c3
Merge pull request #296 from Silent1566/dev4
合并 dev4:同步最新 beta 并完成广告拦截与详情直放复评
2026-09-17 15:53:36 +08:00
Silent1566
8d51819b24 test: align detail direct-play fullscreen contracts
Verification: git diff --check; task_guard check; :app:testMobileArm64_v8aDebugUnitTest focused TMDB direct-play contract suite BUILD SUCCESSFUL (4 test classes)

Task-Guard: beta-sync-review-dev4-20260917
2026-09-17 15:48:50 +08:00
Silent1566
39b1bc3ca7 Merge remote-tracking branch 'origin/beta' into dev4 2026-09-17 15:07:18 +08:00
Silent1566
20d76bd28c fix: align ad block duration column and table width
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.dialog.AdBlockStatsDialogLayoutTest --tests com.fongmi.android.tv.bean.AdBlockStatsTest (BUILD SUCCESSFUL); :app:assembleMobileArm64_v8aDebug (BUILD SUCCESSFUL); adb install -r (Success)

Task-Guard: ad-block-log-final-layout
2026-09-17 14:44:31 +08:00
Silent1566
5cf3d0b2b3 feat: add TMDB source configuration test
Verification: ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.service.TmdbConfigTestServiceTest (BUILD SUCCESSFUL)

Task-Guard: tmdb-source-config-test
2026-09-17 14:39:17 +08:00
Silent1566
8a0fa5342e fix: preserve detail poster rounded corners
Verification: Focused Gradle tests passed: :app:testMobileArm64_v8aDebugUnitTest for defaultPosterRailLeavesRoomForTheFullRoundedPosterCard and cinemaPosterRailLeavesRoomForTheFullRoundedPosterCard; git diff --check passed.

Task-Guard: fix-player-detail-poster-rounded-corners
2026-09-17 14:27:07 +08:00
www.xueximeng.com
80fea00390 feat(mpv): honor global smart ad skipping for HLS
Verification: 15 focused unit tests and Mobile ARM64 APK passed; CRC/v2 signature and 37 native libraries/assets unchanged; vivo V2453A actual MPV frames verified for auto/manual ad skip, global OFF, AES implicit IV, master variants, pause/resume and media isolation; upstream checkpoint 0 errors; temporary probe removed

Task-Guard: P10-mpv-smart-adblock
2026-09-17 14:21:25 +08:00
Silent1566
8bd362e608
Merge pull request #295 from Silent1566/dev3
修复详情直放同页立即全屏
2026-09-17 13:44:42 +08:00
Silent1566
5c67e26db9 test: cover zero ad segment duration logs
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.bean.AdBlockStatsTest --tests com.fongmi.android.tv.ui.dialog.AdBlockStatsDialogLayoutTest (BUILD SUCCESSFUL)

Task-Guard: ad-block-log-zero-duration-test
2026-09-17 13:31:45 +08:00
www.xueximeng.com
54e7947c27 fix(mpv): apply P8 HDR10 compatibility in explicit output modes
Verification: Mobile ARM64 offline build passed (48s); APK CRC/v2 signature and 27 lib plus 10 MPV native identities unchanged; installed on phone; P8 hdr10/mediacodec/pq with explicit GPU/Vulkan hardware observed; user confirmed playback and requested immediate tag; early PixelCopy inconclusive recorded, no further optional tests

Task-Guard: P2-4-p81-hdr10-compat
2026-09-17 13:14:48 +08:00
Silent1566
cb11fea9a9 fix: show zero ad segment duration values
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.dialog.AdBlockStatsDialogLayoutTest (BUILD SUCCESSFUL)

Task-Guard: ad-block-log-duration-value
2026-09-17 13:13:22 +08:00
Silent1566
7d9e912fc4 Merge remote-tracking branch 'origin/beta' into dev3 2026-09-17 13:03:27 +08:00
Silent1566
b952041ce8 fix(detail): restore immediate direct-play fullscreen
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailDirectFullscreenSourceTest (BUILD SUCCESSFUL); restored September 5 immediate enterInlineFullscreen-before-playInline behavior; replacement-character scan clean

Task-Guard: restore-detail-direct-play-immediate-fullscreen
2026-09-17 12:55:36 +08:00
Silent1566
d175bc883b fix: make ad block log table width responsive
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.dialog.AdBlockStatsDialogLayoutTest (BUILD SUCCESSFUL)

Task-Guard: ad-block-log-responsive-width
2026-09-17 12:51:05 +08:00
www.xueximeng.com
c9a1ac99d0 fix(mpv): preserve ownership of FEL context options
Verification: Real mpv ta ASan/UBSan baseline invalid-free reproduction and 7 fixed paths passed; FEL patch forward/reverse roundtrip and static contract passed; arm64/armv7 incremental mpv builds, ELF/export parity and 18 unchanged dependencies passed; Mobile64 APK CRC/v2/native identity passed and installed; vivo V2453A original DV7 full FEL/Vulkan/MediaCodec frames, seek and exit passed (PID 11658); upstream checkpoint passed. Evidence: build/fel-context-ownership; docs/P2-4-mpv-android-fel.md section 9.25.

Task-Guard: P2-4-fel-context-ownership
2026-09-17 12:47:29 +08:00
Silent1566
a109fc7c65 fix(detail): keep direct play in same-page fullscreen
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailDirectFullscreenSourceTest (BUILD SUCCESSFUL)

Task-Guard: fix-detail-direct-play-same-page-fullscreen
2026-09-17 12:44:16 +08:00
Silent1566
8129959f19 fix: restore ad block log duration column layout
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.dialog.AdBlockStatsDialogLayoutTest (BUILD SUCCESSFUL)

Task-Guard: ad-block-log-duration-layout
2026-09-17 12:40:28 +08:00
Silent1566
e1cc282e14 fix(detail): open direct play in fullscreen player
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailDirectFullscreenSourceTest (BUILD SUCCESSFUL)

Task-Guard: fix-detail-direct-play-direct-fullscreen
2026-09-17 12:36:07 +08:00
Silent1566
45525915b6
Merge pull request #294 from Silent1566/dev3
修复详情直放与炫彩详情加载状态
2026-09-17 12:28:43 +08:00
Silent1566
55b6048089 Merge remote-tracking branch 'origin/beta' into dev3 2026-09-17 12:21:29 +08:00
Silent1566
60f2edb519 hide fusion pause overlay while loading
Verification: task guard scope check passed; :app:compileLeanbackArm64_v8aDebugJavaWithJavac completed BUILD SUCCESSFUL in 41s; the standalone pause-info overlay is hidden whenever the native-style loading overlay becomes visible during seek buffering

Task-Guard: fusion-seek-loading-overlay
2026-09-17 12:05:44 +08:00
Silent1566
96ec6b7c3c fix: detect extensionless HLS manifests for ad blocking
Verification: git diff --check passed; ExoHlsAdblockDataSourceTest passed on MobileArm64_v8a debug; extensionless HLS manifests are now detected from response Content-Type while non-HLS segment responses remain unchanged

Task-Guard: exo-extensionless-hls-detection-20260917
2026-09-17 11:58:20 +08:00
Silent1566
2b48087479 match fusion native loading overlay
Verification: activity_tmdb_detail.xml parsed successfully; task guard scope check passed; :app:compileLeanbackArm64_v8aDebugJavaWithJavac completed successfully; PlaybackSpeedMeterTest passed via :app:testLeanbackArm64_v8aDebugUnitTest; simultaneous centered and bottom-right speed readouts now consume the same cached OSD sample; fusion loading overlay now matches the native view_progress structure

Task-Guard: fusion-native-loading-cache
2026-09-17 11:49:09 +08:00
www.xueximeng.com
8919cf1342 fix(exo): enforce manual video decode mode for AVS3
Verification: Mobile ARM64 debug APK and targeted MpvHardwareDecodePolicyTest/ExoAudioCodecSelectorTest passed in app-strict-video-build.log; hardware-only Exo video selector and unchanged independent audio fallback reviewed; user accepted result and requested tag; no additional device probe claimed

Task-Guard: C-AVS3-video-hardware-only
2026-09-17 11:46:59 +08:00
Silent1566
7c94dc4cb7
Merge pull request #293 from Silent1566/dev2
修复跳过片头确认取消后重复弹窗
2026-09-17 11:33:43 +08:00
Silent1566
e1a2a31165 share fusion playback speed sample
Verification: task guard scope check passed; :app:compileLeanbackArm64_v8aDebugJavaWithJavac completed successfully; PlaybackSpeedMeterTest passed via :app:testLeanbackArm64_v8aDebugUnitTest; centered loading and bottom-right OSD now use the single PlaybackSpeedMeter owned by PlayerOsdController

Task-Guard: fusion-shared-speed-sample
2026-09-17 11:30:41 +08:00
www.xueximeng.com
769e53471d feat(player): add baseline AVS3 decoding and fix Exo to MPV surface handoff
Verification: AVS3 native ARM64 8/10-bit decode and flush/replay, dual-ARM ELF/provenance, 3 extractor and 2 MPV policy tests, Exo MP4/MKV device PixelCopy passed as recorded in docs/C-AVS3-video-decoding.md; final Mobile ARM64 APK build passed SHA256 2e40323b300942eecc88482e3254b8a36f9c6e240fcd0f8eadb0a30651ee978f; user accepted phone result and requested tag; High profile 0x30/0x32 remains unsupported

Task-Guard: C-AVS3-video
2026-09-17 11:16:23 +08:00
Silent1566
84afd6e104 fix: prevent repeated intro skip confirmation
Verification: Mobile and Leanback ARM64 targeted unit tests passed; git diff --check passed

Task-Guard: intro-skip-confirm-repeat-fix
2026-09-17 11:12:12 +08:00
Silent1566
14b8791ed9 fix fusion loading indicator on pause
Verification: intentional pause now suppresses the centered loading indicator via isPaused; playWhenReady changes immediately refresh the loading UI; task guard scope check passed; :app:compileLeanbackArm64_v8aDebugJavaWithJavac completed BUILD SUCCESSFUL in 25s

Task-Guard: fusion-loading-pause-hide
2026-09-17 11:06:46 +08:00
Silent1566
d2bd7bf51f feat: detail ad fallback rules and playback context logs
Verification: git diff --check passed; no replacement characters; targeted MobileArm64_v8a debug unit tests passed; completion audit confirmed fallback details and playback context data flow in mobile and leanback UI

Task-Guard: adblock-rule-context-20260917
2026-09-17 10:58:38 +08:00
Silent1566
d907f33223 fix fusion loading indicator dismissal
Verification: updated the loading predicate so active playback overrides a stale isLoading state; task guard scope check passed; :app:compileLeanbackArm64_v8aDebugJavaWithJavac completed BUILD SUCCESSFUL in 26s

Task-Guard: fusion-loading-ready-hide
2026-09-17 10:43:22 +08:00
Silent1566
30badbec9d fix fusion autoplay and loading indicator
Verification: activity_tmdb_detail.xml parsed successfully; task guard scope check passed; :app:compileLeanbackArm64_v8aDebugJavaWithJavac completed BUILD SUCCESSFUL in 1m 1s

Task-Guard: fusion-player-autoplay-loading
2026-09-17 10:04:48 +08:00
Silent1566
a56d3c1b82
Merge pull request #291 from Silent1566/dev4
同步 beta 并完善广告拦截统计
2026-09-17 09:52:09 +08:00
Silent1566
34c5dc2248
Merge pull request #292 from Silent1566/dev2
修复备份恢复后内置壁纸选择被重置
2026-09-17 09:51:05 +08:00
Silent1566
5435c01445 fix(detail): bind service for explicit direct play
Verification: DetailModeControllerTest passed via :app:testMobileArm64_v8aDebugUnitTest; git diff --check passed; controlled device 192.168.50.3:5559 on the exact built APK showed explicit Play resolving media, PlaybackService bound, Exo STATE_READY/first frame, fullscreen reveal, and position advancing to 14s without autoplay

Task-Guard: detail-direct-play-service-binding
2026-09-17 09:34:05 +08:00
Silent1566
3f9079169b fix: preserve selected builtin wallpaper through backup restore
Verification: Gradle :app:testMobileArm64_v8aDebugUnitTest focused WallRestorePreferenceTest + BackupPreferenceFilterTest passed; appBackup/selective restore now call WallConfig.initPreservingSelection so backup wall/wall_type survive reload

Task-Guard: wall-backup-restore-fix
2026-09-17 02:14:37 +08:00
Silent1566
28ec0f97c7 merge: 同步 beta 并修复广告统计回归
Verification: 已合并并复审 origin/beta@95309a5a13aa37bd33ef582b271c4e8e93ed454a;Leanback Arm64 Debug Java/resource 编译成功;Mobile Arm64 Debug 12 个定向测试套件共 63 项通过,failures=0、errors=0、skipped=0;git diff --check 与任务守卫检查通过

Task-Guard: dev4-beta-sync-review-20260917
2026-09-17 02:14:00 +08:00
Silent1566
4330347408 test: restore first-frame detail player reveal contract
Verification: :app:testMobileArm64_v8aDebugUnitTest DetailModeControllerTest + currentInlineEpisodeCardEntersFullscreenWithoutReloading passed; git diff --check passed

Task-Guard: detail-direct-play-black-screen
2026-09-17 01:56:44 +08:00
Silent1566
0da71892b5 fix: use complete ad log field labels
Verification: Chinese field-label unit test passed: BUILD SUCCESSFUL in 45s; Mobile ARM64 APK build passed: BUILD SUCCESSFUL in 18s; install -r to 192.168.50.3:5561 succeeded; device UI showed exact labels 切片开始时间, 切片结束时间, 广告切片总时长 with nonzero values; Gradle daemons stopped; git diff --check passed

Task-Guard: adblock-log-field-labels
2026-09-17 01:37:05 +08:00
Silent1566
0c38ed7707 fix: detail HLS fallback ad segments
Verification: Fallback diff extraction unit test passed; Mobile and Leanback targeted rule/pipeline tests passed: BUILD SUCCESSFUL in 46s; Mobile ARM64 APK build passed: BUILD SUCCESSFUL in 20s and install -r to 192.168.50.3:5561 succeeded; real dytt playback produced per-segment start/end/duration and siteName=电影天堂[采]; device rule manager showed concrete fallback criteria and persisted false/true toggle state; device chart showed real bars; git diff --check passed

Task-Guard: adblock-fallback-detail
2026-09-17 01:31:02 +08:00
Silent1566
0a4919184b test: add detail direct play device smoke test
Verification: ANDROID_SERIAL=192.168.50.3:5559 ./gradlew :app:connectedMobileArm64_v8aDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.fongmi.android.tv.ui.activity.TmdbDetailDirectPlayInstrumentedTest (1 test passed)

Task-Guard: add-detail-direct-play-instrumentation
2026-09-17 01:30:20 +08:00
Silent1566
a2bf7e2870 fix: show complete ad block log table
Verification: Mobile and Leanback targeted tests passed: BUILD SUCCESSFUL in 55s; mobile ARM64 APK build passed: BUILD SUCCESSFUL in 2m 1s; install -r to 192.168.50.3:5561 succeeded; device UI showed seven requested table columns plus pipeline; live dytt playback persisted siteKey=dytt, siteName=电影天堂[采], siteDomain=vip.dytt-tvs.com; git diff --check passed

Task-Guard: adblock-log-table-fields
2026-09-17 01:13:38 +08:00
Silent1566
c1895e88ce fix: render ad block statistics chart
Verification: Mobile and Leanback targeted unit tests after chart changes: BUILD SUCCESSFUL in 1m 22s; git diff --check passed

Task-Guard: adblock-stats-finalize
2026-09-17 00:25:44 +08:00
Silent1566
95309a5a13
Merge pull request #290 from Silent1566/dev2
修复移动端跨选集分页连续播放
2026-09-16 23:19:18 +08:00
Silent1566
4de11c8347 fix: record ad segment start times
Verification: git diff --check passed; task_guard check passed; mobile and leanback targeted unit tests passed including segment start and duration coverage: BUILD SUCCESSFUL

Task-Guard: adblock-stats-completion
2026-09-16 23:16:44 +08:00
Silent1566
726a878e58 Merge remote-tracking branch 'origin/beta' into dev2 2026-09-16 23:13:35 +08:00
Silent1566
b427a64552 feat: add ad block logs and statistics views
Verification: git diff --check passed; task_guard check passed; mobile and leanback targeted unit tests passed: BUILD SUCCESSFUL

Task-Guard: adblock-stats-log-ui
2026-09-16 23:05:28 +08:00
Silent1566
1767bef3bb fix(mobile): continue episode navigation across range pages
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.PlayerPlaybackRegressionSourceTest (BUILD SUCCESSFUL); git diff --check passed

Task-Guard: fix-episode-range-autoplay
2026-09-16 23:03:14 +08:00
Silent1566
0727a2afd6
Merge pull request #289 from Silent1566/dev2
feat: TV 播放菜单遮盖层设置
2026-09-16 22:26:52 +08:00
Silent1566
6f90ec5952 feat: add playback overlay setting to leanback players
Verification: app:testLeanbackArmeabi_v7aDebugUnitTest:SettingPlaybackOverlayTest+SettingPlaybackDefaultsTest BUILD SUCCESSFUL

Task-Guard: tv-playback-overlay-switch
2026-09-16 22:00:37 +08:00
Silent1566
055c244c47 fix(detail): reveal direct play on first frame
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailDirectPlayTransitionSourceTest (BUILD SUCCESSFUL)

Task-Guard: fix-detail-direct-play-first-frame
2026-09-16 19:05:20 +08:00
Silent1566
ddd7899b71 fix(detail): require explicit play in direct mode
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.detail.PlayerDetailControllerSourceTest (BUILD SUCCESSFUL)

Task-Guard: fix-detail-direct-play-regression
2026-09-16 19:01:16 +08:00
Silent1566
6b8b3d8597
Merge pull request #288 from Silent1566/dev2
修复切换剧集继承上一集播放进度
2026-09-16 18:16:11 +08:00
Silent1566
acd33eba8c Merge remote-tracking branch 'origin/beta' into dev2 2026-09-16 18:13:07 +08:00
Silent1566
2f3f2a5999
Merge pull request #287 from Silent1566/dev3
修复 HLS 无规则时误触发广告启发式过滤
2026-09-16 18:08:35 +08:00
Silent1566
1d9c38c400 Merge remote-tracking branch 'origin/beta' into dev2 2026-09-16 18:06:04 +08:00
Silent1566
2831706061 Merge remote-tracking branch 'origin/beta' into dev3 2026-09-16 17:25:38 +08:00
Silent1566
4e1d303760 fix: prevent next episode inheriting previous progress
Verification: git diff --check passed; :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.PlayerPlaybackRegressionSourceTest completed BUILD SUCCESSFUL; task_guard check passed

Task-Guard: fix-next-episode-progress
2026-09-16 17:14:01 +08:00
Silent1566
6818f27648
Merge pull request #286 from Silent1566/dev4-ad-block-stats-20260916170527
优化广告拦截统计弹窗
2026-09-16 17:09:12 +08:00
Silent1566
6b8b8a325f fix: gate Exo parser ad heuristic behind configured rules
Verification: ExoParserAdblockGateTest passed; mobileArm64_v8aDebug build succeeded; installed APK 5939f11e8cc62e2578e34404e8c80ff5ee9b1a1d765ea18a285ac20a4dba0077; device replay logs manifest 38687 unchanged removed=0 legacy=false and durationMs=2847879; screenshot showed 19:08/47:28

Task-Guard: EXO-PARSER-ADBLOCK-UNINVITED
2026-09-16 17:01:23 +08:00
Silent1566
86cb397ecf Merge remote-tracking branch 'origin/beta' into dev4 2026-09-16 16:59:26 +08:00
Silent1566
df6a54dce2 fix: stop local HLS proxy from using unconfigured ad heuristics
Verification: focused mobile tests passed (M3u8LegacyFallbackTest 1/1; HlsAdblockPipelineTest 4/4; SiteHealthReportSourceTest 4/4); app proxy log removed=0 legacy=false and response duration 47:27.880; APK 31a963f7782dfbc54ea82eeca9637a6fb1e06b608d3fe3d118699ce083ec9173 installed

Task-Guard: HLS-PROXY-LEGACY-BYPASS
2026-09-16 16:56:09 +08:00
Silent1566
079c6b369e fix(ad-block): expand statistics dialog surface
Verification: AdBlockStatsDialogLayoutTest BUILD SUCCESSFUL;Mobile 与 Leanback Arm64 Debug Java 编译成功;白色根视图最小高度已与近全屏 Window 高度同步;git diff --check 与 task guard check 通过;Gradle 守护进程已停止�,资源已释放

Task-Guard: ad-block-stats-dialog-surface-height
2026-09-16 16:51:18 +08:00
Silent1566
90f46a351b fix(ad-block): maximize statistics dialog viewport
Verification: AdBlockStatsDialogLayoutTest BUILD SUCCESSFUL;Mobile 与 Leanback Arm64 Debug Java 编译成功;固定安全边距尺寸约束测试通过;git diff --check 与 task guard check 通过;Gradle 守护进程已停止,资源已释放

Task-Guard: ad-block-stats-adaptive-fullscreen
2026-09-16 16:30:53 +08:00
Silent1566
1fbdcb9410 feat(ad-block): add tabbed statistics overview
Verification: AdBlockStatsDialogLayoutTest BUILD SUCCESSFUL; Mobile 与 Leanback Arm64 Debug APK BUILD SUCCESSFUL; 设备 192.168.50.3:5561 安装并运行成功;UI 层级确认概览、站点、规则、播放链路四页签及站点统计概览;截图视觉检查通过;��git diff --check 与 task guard check 通过;Gradle 守护进程已停止

Task-Guard: ad-block-stats-tabs-redesign
2026-09-16 16:06:16 +08:00
Silent1566
37c6292853 fix: prevent HLS ad heuristics from running uninvited
Verification: task_guard check passed; focused :app:testLeanbackArm64_v8aDebugUnitTest HlsAdblockPipelineTest BUILD SUCCESSFUL (4 tests, 0 failures/errors, changed Exo source compiled); git diff --check passed

Task-Guard: HLS-AD-FALLBACK-MISFIRE
2026-09-16 15:47:16 +08:00
Silent1566
e707944f47 feat(ad-block): redesign statistics dialog
Verification: AdBlockStatsDialogLayoutTest BUILD SUCCESSFUL; assembleMobileArm64_v8aDebug and assembleLeanbackArm64_v8aDebug BUILD SUCCESSFUL; git diff --check passed; task guard check passed; Gradle daemons stopped after build

Task-Guard: ad-block-stats-dialog-redesign
2026-09-16 14:47:35 +08:00
www.xueximeng.com
dbff1ffecd feat(mpv): add bounded FEL descriptor binding diagnostics
Verification: P2-4 9.24 B first tier: real native probe/core/VO ASan/UBSan PASS including no probe GPU execution, fresh binds, budgets, cancelled/failed cleanup, deferred fences and pause intent; focused 21 Java tests and product compilation PASS; actual Java-generated Web script PASS; full pre-FEL patch forward/reverse and 27-file roundtrip plus existing contracts PASS; dual ARM builds/ELF/public libmpv exports PASS; 18 other MPV libraries and all 27 APK lib/ libraries byte-identical to baseline; TV64 build 202609161336 native asset hashes, full ZIP CRC and v2 signature PASS; 104 protected CXX files unchanged; upstream checkpoint PASS. APK SHA256 9192d5a6df9cb5615f7bacaed8bd55200fd7240bacfd04727dd4324eca2e876e. Evidence /private/tmp/webhtv-fel-bind-probe-pa3hqm7z/. No TV or sustained-performance acceptance claimed.

Task-Guard: P2-4-fel-bind-probe
2026-09-16 13:46:14 +08:00
Silent1566
8d7d0ed2fa
Merge pull request #285 from Silent1566/dev4
重构详情页模式控制器并完善广告统计
2026-09-16 13:44:59 +08:00
Silent1566
d3b3df5ea5 refactor(detail): delegate playback behavior to mode controllers
Verification: :app:testMobileArm64_v8aDebugUnitTest :app:testLeanbackArm64_v8aDebugUnitTest :app:assembleMobileArm64_v8aDebug :app:assembleLeanbackArm64_v8aDebug BUILD SUCCESSFUL; second independent review found no findings

Task-Guard: detail-mode-controller-delegation-20260916
2026-09-16 13:29:41 +08:00
Silent1566
88acf05c1f feat: 统一健康报表广��告统计维度
Verification: Mobile/Leanback ARM64 SiteHealthReportSourceTest 通过;健康报表读取统一广告统计总数、站点、规则和播放链路维度;实施计划完成记录已补齐;git diff --check 通过;Gradle 守护进程已停止

Task-Guard: AD-STATS-HEALTH-20260916
2026-09-16 13:06:43 +08:00
Silent1566
ca82dfc494 fix: 修复广告统计弹窗可见性与中文文案
Verification: Mobile/Leanback ARM64 定向测试通过;AdBlockStatsDialogLayoutTest 通过;Mobile ARM64 APK 构建并安装到 192.168.50.3:5561;截图与 UIAutomator 确认总览、站点排行、规则排行、播放链路排行及底部按钮均可见且可滚动;git diff --check 通过

Task-Guard: AD-STATS-UI-20260916
2026-09-16 12:58:38 +08:00
www.xueximeng.com
8de0fd7094 fix(mpv): select DV7 FEL before video chain initialization
Verification: P2-4 9.23: 6 focused Java classes / 34 tests and compilation PASS; actual C startup-selection/core/VO/decoder/descriptor contracts with ASan/UBSan PASS; dual ARM native builds, ELF and public exports PASS; other 18 libraries byte-identical; 24-file source/patch roundtrip PASS; TV64 APK native hashes/ZIP CRC/v2 signature PASS; 104 protected app/.cxx files unchanged; final patch reverse-apply and diff-check PASS; corrected upstream checkpoint 0 errors, 1 declared native-scope warning. Evidence: /private/tmp/webhtv-fel-startup-uwqa5kyt/. No TV performance acceptance claimed.

Task-Guard: P2-4-fel-startup-selection
2026-09-16 12:49:38 +08:00
www.xueximeng.com
5df95f4750 docs(mpv): refine FEL diagnosis with cross-project source and binary evidence
Verification: Assessment-only: source revisions/hashes, log33 cache controls, native timer and selected-track call order, Kodi MediaCodec disassembly, unique index link and checkpoint checks passed; evidence /private/tmp/webhtv-fel-cross-project-fhko9uzb/review-verification.txt. No production edits, builds, or TV performance acceptance.

Task-Guard: P2-4-fel-cross-project
2026-09-16 08:27:50 +08:00
www.xueximeng.com
98d247ea19 docs(mpv): assess log33 FEL startup and persistent GPU stalls
Verification: Log33 identity and 3829 unique events verified; three performance summaries and 1419 command/203 write accounting verified; 15 observed cache-pause false and 15 buffering-state 100 records verified; startup/FEL rebuild timeline reviewed against production call flow; checkpoint/diff validation PASS; assessment documents only, no code/native/APK change; evidence /private/tmp/webhtv-fel-log33-0odn5fr1

Task-Guard: P2-4-fel-log33-review
2026-09-16 07:55:56 +08:00
www.xueximeng.com
44dd3f1386 fix(debug): remove pairing and promote log actions
Verification: DiagnosticExportAccessTest 5/5 PASS; actual Java HTML Chromium 320/390/844/1440 PASS; TV64 assemble 61s PASS; 10 packaged MPV libraries, v2 signature and ZIP budget PASS; checkpoint and diff checks PASS; evidence /private/tmp/webhtv-debug-web-actions.ALJuwC; APK SHA256 f5f13571b3a210ab689d8aed3963620399bbcd75f191ecdf7e49debc98938eab; device FEL performance remains pending

Task-Guard: AV-DIAG-01-WEB-ACTIONS
2026-09-16 07:26:55 +08:00
www.xueximeng.com
ed3d710ef5 perf(mpv): reuse unchanged FEL descriptor contents with fresh commands
Verification: Real mapper ASan/UBSan: 1200 frames, 72 writes, 1200 fresh bind/record/dispatch; ABA/pending/failure/push/latency cases pass; patch forward/reverse + static contract; both ARM builds, ELF and public exports; 18 other libraries byte-identical; TV64 202609160647 all 10 assets, v2 signature and compact ZIP verified. Device pixels/performance pending, candidate only. Evidence: /private/tmp/webhtv-fel-descriptor-content.xqkvwpr9

Task-Guard: P2-4-fel-descriptor-content
2026-09-16 06:53:30 +08:00
www.xueximeng.com
5f6fd1a75c docs: assess FEL Vulkan descriptor stalls across projects
Verification: Documentation-only review: log32 and live snapshot have 2429 identical deduplicated events; metrics and pinned-source citations reviewed; two-document scope, eight sections, index anchor and diff whitespace validated; upstream checkpoint verifier reports 0 errors and 0 warnings. No production edits, build, or device test.

Task-Guard: P2-4-fel-descriptor-review
2026-09-16 06:22:00 +08:00
www.xueximeng.com
57211803d5 mpv: add bounded FEL wait diagnostics for TV logs
Verification: P2-4 9.18: actual-function ASan/UBSan and existing FEL behavior checks passed; corrected stale AV-DIAG log-entry static contract passed; both ABI builds/ELF/public exports passed, 18 dependencies unchanged; 13 Java tests passed; TV64 6e9bba7846e2e99620757c7ced5c357b287ce1bc64562a79f2db511e83c86a51 native assets/signature/ZIP passed. Diagnostic candidate only; TV performance awaits Web logs.

Task-Guard: P2-4-fel-wait-diagnostics
2026-09-16 05:35:16 +08:00
Silent1566
32640b193f Merge remote-tracking branch 'origin/beta' into beta 2026-09-16 00:47:58 +08:00
Silent1566
ca3860c348 fix: avoid obsolete Android SDK tools package
Verification: Workflow YAML parses; setup-android packages is explicitly platform-tools; obsolete tools package is no longer requested; git diff --check passes

Task-Guard: fix-android-release-sdk-setup
2026-09-16 00:42:14 +08:00
Silent1566
2e17c9387b feat: unify ad block statistics and reporting
Verification: Leanback Arm64 定向单元测试通过;Mobile Arm64 定向单元测试通过;git diff --check 通过;任务范围与受保护路径检查通过;未打包 APK。

Task-Guard: ad-block-statistics-unification
2026-09-16 00:13:16 +08:00
Silent1566
69ea9c5d37
Merge pull request #284 from Silent1566/dev3
修复详情直放全屏切换并同步 beta 最新代码
2026-09-15 23:49:21 +08:00
Silent1566
34dfa5a7ea Merge remote-tracking branch 'origin/beta' into dev3 2026-09-15 23:24:15 +08:00
Silent1566
82671833bb fix(detail): enter direct-play fullscreen immediately
Verification: DetailModeControllerTest and TmdbDetailActivityLayoutTest passed; Mobile arm64 Debug APK built and installed successfully; emulator 192.168.50.3:5559 screenshots confirm immediate fullscreen at ~1s and playing fullscreen at ~6s; git diff --check passed

Task-Guard: fix-detail-player-immediate-fullscreen
2026-09-15 23:15:39 +08:00
Silent1566
ffd669dd6d
Merge pull request #283 from Silent1566/dev4
feat: 完善 HLS 广告过滤与播放提示
2026-09-15 22:49:13 +08:00
Silent1566
6bc447a14c feat: 为 Exo 播放接入 HLS 广告过滤
Verification: bash ./gradlew :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.player.exo.ExoHlsAdblockDataSourceTest (BUILD SUCCESSFUL)

Task-Guard: exo-hls-adblock-review
2026-09-15 22:32:32 +08:00
Silent1566
e935202e78 fix(detail): release player when leaving detail
Verification: TmdbDetailActivityLayoutTest passed; Mobile arm64 Debug APK built and installed successfully on 192.168.50.3:5559; device test confirmed playback exit removes the media session and abandons audio focus before re-entry; git diff --check passed

Task-Guard: fix-detail-player-exit-release
2026-09-15 21:40:59 +08:00
Silent1566
9ada5f3484 test(detail): align fullscreen playback source contracts
Verification: :app:testMobileArm64_v8aDebugUnitTest focused DetailModeControllerTest and TmdbDetailActivityLayoutTest BUILD SUCCESSFUL; task_guard check passed; git diff --check passed

Task-Guard: fix-detail-player-source-contract-followup
2026-09-15 21:12:28 +08:00
Silent1566
f28dceb8aa fix: record MPV HLS adblock stats and notify playback
Verification: LeanbackArm64_v8aDebug and MobileArm64_v8aDebug targeted unit tests passed; git diff --check passed; task guard check passed

Task-Guard: hls-adblock-mpv-stats-toast
2026-09-15 21:03:07 +08:00
Silent1566
948000af96 fix(detail): reveal player fullscreen on first frame
Verification: task_guard check passed; git diff --check passed; :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.detail.DetailModeControllerTest BUILD SUCCESSFUL in 15s

Task-Guard: fix-detail-player-startup-flicker-followup
2026-09-15 20:55:07 +08:00
Silent1566
cbb651f8ae feat: record HLS adblock hits and notify playback
Verification: LeanbackArm64_v8aDebug and MobileArm64_v8aDebug targeted unit tests passed; git diff --check passed; task guard check passed

Task-Guard: hls-adblock-stats-toast
2026-09-15 19:49:59 +08:00
Silent1566
264c0a5eb3 fix: preserve detail player surface during startup
Verification: DetailModeControllerTest passed: BUILD SUCCESSFUL in 11s; git diff --check passed

Task-Guard: fix-detail-player-startup-flicker
2026-09-15 18:48:53 +08:00
www.xueximeng.com
206a57e0e3 fix(exo): include ASS rendering in normal builds
Verification: No ASS Gradle property: MobileArm64_v8aDebug and LeanbackArm64_v8aDebug build passed in 1m23s; both BuildConfig fields absent, compiled session creation present, packaged JNI SHA-256 matches prebuilt and ZIP 16KiB aligned; upstream checkpoint check passed. Evidence: /private/tmp/exo-ass-required-build.log and /private/tmp/exo-ass-required-artifacts.json

Task-Guard: E4-LIBASS-required-build
2026-09-15 18:20:35 +08:00
www.xueximeng.com
248a947ba8 feat(debug): capture crawler consoles and organize web logs into responsive tools
Verification: Python stream contracts 7 PASS; crawler category JUnit 1 PASS; actual Java HTML Chrome 4 viewports PASS including fixed toolbar, focus, tabs, pairing and filters; final mobile/leanback arm64 APK build PASS 57s, Python bridge/new drawer/libexo_ass packaged; checkpoint verifier 0 errors; evidence docs/AV-DIAG-01-playback-diagnostics.md section 14.15 and /private/tmp/pr107-artifacts.json

Task-Guard: AV-DIAG-01-CRAWLER-WEB
2026-09-15 17:59:30 +08:00
www.xueximeng.com
5acbb05aff feat(diagnostics): complete native evidence and categorized playback logging
Verification: AV-DIAG-01: both arm64 APKs built with libass enabled (final Java increment 28s); final APK DEX definitions and all 10 MPV assets match; Media3 selective AAR compilation preserved unrelated classes; ARM64/ARMv7 FFmpeg and MPV builds plus ELF/namespace/marker checks passed; production ELF32/64 and mapped APK identity parser matched readelf and SHA256 including absent GNU build-id; changed script syntax, 62 coverage IDs, patch lock hash, diff whitespace and upstream checkpoint check passed. Prior 23 App contract cases retained; device playback/performance acceptance is user-run.

Task-Guard: AV-DIAG-01-COMPLETE-NATIVE
2026-09-15 16:21:58 +08:00
Silent1566
7c1fe4a1b5 test: lock detail direct play explicit playback
Verification: MobileArm64 DetailModeControllerTest focused offline BUILD SUCCESSFUL in 13s; source change committed in dcae3bb7c7; task records add explicit-playback regression and final test result

Task-Guard: fix-detail-player-auto-entry
2026-09-15 16:19:58 +08:00
Silent1566
a2b1de5852
Merge pull request #281 from Silent1566/dev2
简化 Python 蜘蛛源码加载并完成复评
2026-09-15 14:46:49 +08:00
Silent1566
935a479fc0 fix: 简化 Python 蜘蛛源码加载
Verification: python3 py_compile、git diff --check、内联源码加载运行时探针、:chaquo:compileArm64_v8aDebugJavaWithJavac 与 task_guard check 均通过

Task-Guard: dev2-beta-sync-review-20260915
2026-09-15 14:41:50 +08:00
www.xueximeng.com
180811f160 feat(diagnostics): add categorized capture controls, incident reports and bounded probes
Verification: Mobile and Leanback arm64 Java compilation passed (92s); 23 diagnostic contract tests passed (20s); embedded JS syntax, new field allowlist and diff whitespace passed; device/performance acceptance remains user-run

Task-Guard: AV-DIAG-01-COMPLETE-APP
2026-09-15 14:10:54 +08:00
www.xueximeng.com
8d46751d7f fix(diagnostics): preserve MPV native attempt ownership across media changes
Verification: Mobile/Leanback arm64 Java compilation PASS (24s, /private/tmp/avdiag-mpv-owner-compile.log); MPV schema 41 fields/12 events PASS; diff/checkpoint PASS (0 errors, 0 warnings); no automated/device/performance tests, APK packaging, installation or push

Task-Guard: AV-DIAG-01-MPV-OWNER
2026-09-15 13:12:50 +08:00
www.xueximeng.com
ac02ce84ae feat(diagnostics): add IJK evidence and bounded process recovery journal
Verification: D4 Mobile/Leanback arm64 Java compilation PASS (32s, /private/tmp/avdiag-recovery-compile.log); schema/static diff/checkpoint verification PASS; no automated/device/crash/performance tests per user preference

Task-Guard: AV-DIAG-01-RECOVERY
2026-09-15 12:56:23 +08:00
Silent1566
dcae3bb7c7 fix: enter detail direct-play fullscreen immediately
Verification: Mobile Arm64 DetailModeControllerTest and TmdbDetailActivityLayoutTest offline BUILD SUCCESSFUL in 12s; git diff --check; rebuilt and installed mobileArm64_v8a debug APK; emulator 192.168.50.3:5559 screenshot at ~1s showed fullscreen player before READY and ~6s showed playing fullscreen video

Task-Guard: fix-detail-direct-play-immediate-fullscreen
2026-09-15 12:43:57 +08:00
www.xueximeng.com
88780d4dc8 feat(diagnostics): retain MPV native events and cached pipeline health
Verification: D3 final Mobile/Leanback arm64 Java compilation PASS (/private/tmp/avdiag-mpv-final-compile.log); diagnostic schema and continuous-log wiring/static diff PASS; native/device/flood/performance verification reserved for user, not executed

Task-Guard: AV-DIAG-01-MPV
2026-09-15 12:33:53 +08:00
Silent1566
9058fb1221 fix: preserve detail direct-play fullscreen transition
Verification: Mobile Arm64 DetailModeControllerTest and TmdbDetailActivityLayoutTest offline BUILD SUCCESSFUL in 9s; git diff --check; rebuilt and installed mobileArm64_v8a debug APK; emulator 192.168.50.3:5559 direct-play tap showed fullscreen 1920x1080 player

Task-Guard: fix-detail-direct-play-mode-runtime
2026-09-15 12:07:38 +08:00
www.xueximeng.com
57656c06bd feat(diagnostics): observe Exo decoder, surface and audio output evidence
Verification: D1/D2 public-hook collectors: final Mobile/Leanback arm64 Java compilation PASS (36s, /private/tmp/avdiag-exo-final-compile.log); schema allowlist/static diff PASS; user requested manual device testing, no automated/device/performance test run

Task-Guard: AV-DIAG-01-EXO
2026-09-15 12:06:12 +08:00
Silent1566
36ceca9612
Merge pull request #280 from Silent1566/dev2
ui: 统一弹窗圆角样式
2026-09-15 11:24:48 +08:00
Silent1566
5e4bb691f8 fix(ui): keep site dialog background theme-aware
Verification: 资源合并通过;移动端单元测试4361个,0失败0错误1跳过;SiteDialogThemeSourceTest 5个全部通过

Task-Guard: ui-rounded-dialogs-review
2026-09-15 11:15:22 +08:00
www.xueximeng.com
684f606639 fix(mpv): show player rebuffer statistics in playback panel
Verification: 用户实测确认:可以了,打个tag;现场日志证实内部重缓冲10次、76383ms,面板误读Exo空快照;手机arm64构建成功(23秒),修复包已覆盖安装并启动;未追加测试。

Task-Guard: MPV-REBUFFER-PANEL
2026-09-15 11:09:14 +08:00
www.xueximeng.com
a18c409b6d fix(mpv): synchronize script button activation with Lua execution
Verification: 用户实测确认:可以了,打个tag;手机 arm64 debug 构建成功(25秒),修正版覆盖安装及启动成功;按用户要求未追加测试。

Task-Guard: MPV-SCRIPT-BUTTON-STATE
2026-09-15 10:32:16 +08:00
www.xueximeng.com
0667ff435b fix(git-cloud): support token storage without AndroidKeyStore
Verification: User confirmed actual TV app behavior works and explicitly requested tag; leanbackArmeabi_v7aDebug and AndroidTest APK build passed (2m57s); installed on V2453A with OEM installer assistance; GitCloudTokenStoreTest 8/8 passed on device, covering missing-provider GitHub/CNB token storage, IV randomization, provider return, legacy AES-GCM format, broken-provider refusal, missing/corrupt keys and authentication failure; legacy system ciphertext on a provider-missing runtime requires token re-entry; no UI or player changes

Task-Guard: FIX-GITCLOUD-KEYSTORE
2026-09-15 07:54:28 +08:00
Silent1566
beab836e71 ui-rounded-dialogs-phase5: apply rounded dialog theme globally
Verification: mobile and leanback unit tests passed offline; DialogRoundedCornerSourceTest passed

Task-Guard: ui-rounded-dialogs-phase5
2026-09-15 06:47:16 +08:00
Silent1566
edde56864e ui-rounded-dialogs-phase4: apply rounded builder style
Verification: mobile and leanback unit tests passed offline; DialogRoundedCornerSourceTest passed

Task-Guard: ui-rounded-dialogs-phase4
2026-09-15 06:40:06 +08:00
Silent1566
51cf91d123 ui-rounded-dialogs-phase3: unify dialog buttons
Verification: mobile and leanback unit tests passed offline; DialogRoundedCornerSourceTest passed

Task-Guard: ui-rounded-dialogs-phase3
2026-09-15 06:32:51 +08:00
www.xueximeng.com
bed561691c fix(exo): render container ASS packets with original fonts
Verification: User confirmed actual playback works and explicitly requested tag; ASS input tests 14/14 passed; native/API24/16KiB/provenance/JNI and final APK checks passed; device packet golden, JNI bounds, external lifecycle, disabled and no-subtitle tests passed (5/6); container lifecycle initial failure classified as pre-existing drawing-only Cue fixture baseline, fixture corrected and rebuilt, rerun cancelled after explicit user acceptance; final APK SHA256 07cd2260dbf07134c62c146192c677a526ccdcd24a29ea2f7df710ff8d304885

Task-Guard: E4-LIBASS-runtime
2026-09-15 06:10:55 +08:00
Silent1566
92fd3cb504 ui-rounded-dialogs-phase2: align remaining dialog radius
Verification: mobile and leanback unit tests passed offline; DialogRoundedCornerSourceTest passed

Task-Guard: ui-rounded-dialogs-phase2
2026-09-15 05:58:06 +08:00
Silent1566
71ced3b93b ui-rounded-dialogs-phase1: unify outer dialog radius
Verification: mobile and leanback unit tests passed offline; DialogRoundedCornerSourceTest passed

Task-Guard: ui-rounded-dialogs-phase1
2026-09-15 05:41:54 +08:00
www.xueximeng.com
e7c0cdf0d6 feat(exo): add gated libass rendering with attached fonts
Verification: Input tests 6/6; latest native golden/lifecycle device tests 4/4 (7.012s); normal user ASS 6.63% of one CPU core and 2.679ms render+upload p95; three off/on pairs pass user-approved complex budget (max 36.65% core, 12.574ms, 59.35MiB PSS, zero drops/underruns); eight release cycles +1.86MiB and actual worker exit; native/API24/16KiB/Maven/APK verification passed; license whitespace normalized

Task-Guard: E4-LIBASS-stage1
2026-09-15 04:24:00 +08:00
Silent1566
02ef5ec38d ui-rounded-dialogs: unify site dialog corner radius
Verification: mobile focused unit tests SiteDialogLayoutTest/SiteDialogThemeSourceTest/MobileSiteAdapterStyleTest and leanback unit tests passed offline

Task-Guard: ui-rounded-dialogs
2026-09-15 04:03:54 +08:00
Silent1566
01c5798b0f fix: restore detail direct play fullscreen entry
Verification: Mobile Arm64 DetailModeControllerTest and TmdbDetailActivityLayoutTest offline BUILD SUCCESSFUL in 15s; guard check passed

Task-Guard: fix-detail-direct-play-mode
2026-09-15 00:31:41 +08:00
Silent1566
1388aca123
Merge pull request #279 from Silent1566/dev2
dev2: 合并 beta 最新代码并完成复评
2026-09-14 23:41:21 +08:00
Silent1566
a130c423df merge: 合并 beta 最新代码并完成 dev2 复评
Verification: merge origin/beta 06442ea996 without conflicts; focused tests and leanback compile BUILD SUCCESSFUL in 35s; git diff --check HEAD passed

Task-Guard: beta-sync-dev2-20260914-2
2026-09-14 23:24:01 +08:00
Silent1566
3cb0a94dcd Merge remote-tracking branch 'origin/beta' into dev2 2026-09-14 23:16:59 +08:00
Silent1566
d9bcceb9b4 feat: cache personal recommendation pages
Verification: :app:testMobileArm64_v8aDebugUnitTest PersonalRecommendationServiceTest and :app:compileMobileArm64_v8aDebugJavaWithJavac passed

Task-Guard: personal-recommendation-cache-v1
2026-09-14 23:00:04 +08:00
www.xueximeng.com
5cde3c0152 fix(mpv): preserve ASS script fonts and explicit style overrides
Verification: 用户已确认 MPV 原字形恢复正常;Mobile/Leanback Java 编译通过;仅移除 App 自动生成的 ASS FontName/style 覆盖,保留用户 mpv.conf/Lua 配置。Exo 未完成改动不在本次提交中。

Task-Guard: E4-LIBASS-mpv-font
2026-09-14 22:22:55 +08:00
Silent1566
06442ea996
Merge pull request #278 from Silent1566/dev3
dev3: 合并 beta 最新代码并保留本地播放修复
2026-09-14 21:00:59 +08:00
Silent1566
b38aaad0d1 merge: 合并 beta 最新代码并保留本地播放修复 2026-09-14 20:43:55 +08:00
Silent1566
55006efe62
Merge pull request #277 from Silent1566/dev2
fix: 影视原生详情页避免重复加载层
2026-09-14 20:09:09 +08:00
Silent1566
3727bcf7a5 merge: 合并 beta 最新代码并保留本地播放修复 2026-09-14 19:54:27 +08:00
Silent1566
1adf6d9b88 merge: 合并 beta 最新代码并完成 dev2 复评
Verification: git merge fcf0285d0e5f2d470999538dad797a54d4a8c690无冲突; ./gradlew :app:testMobileArmeabi_v7aDebugUnitTest --tests VideoActivityLayoutTest BUILD SUCCESSFUL in 24s; ./gradlew :app:compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL in 8s; git diff --check通过

Task-Guard: beta-sync-dev2-20260914-closure
2026-09-14 18:55:21 +08:00
Silent1566
8ae8bd1ce6 Merge commit 'fcf0285d0e' into dev2 2026-09-14 18:42:45 +08:00
www.xueximeng.com
845ce82c64 docs: refine E4-LIBASS integration and validation plan
Verification: Reviewed fixed upstream sources, libass-tests fixtures and packaged Media3 source JARs; exoplayer/extractor source SHA-256 match media-lock; scoped links, tables, fences, S01-S27 evidence IDs and cited source symbols passed; strict upstream checkpoint: 0 errors, 0 warnings; documentation only, no runtime tests

Task-Guard: E4-LIBASS-review
2026-09-14 18:18:00 +08:00
Silent1566
1b2dda6b98 fix: dedupe direct-native playback loading shell
Verification: ./gradlew :app:testMobileArmeabi_v7aDebugUnitTest --tests VideoActivityLayoutTest BUILD SUCCESSFUL

Task-Guard: direct-native-loading-dedupe
2026-09-14 18:17:37 +08:00
Silent1566
058a5e22d1
Merge pull request #276 from Silent1566/beta-review-dev1-20260914-fcf0285
合并 beta 最新代码并同步 VC-1 产物校验路径
2026-09-14 18:04:31 +08:00
Silent1566
fcf0285d0e test: 同步 dev1 与 beta 的 VC-1 产物校验路径
Verification: ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests FfmpegVc1SupportTest --tests BackupPreferenceFilterTest --tests TmdbUIAdapterTest --no-daemon: BUILD SUCCESSFUL

Task-Guard: beta-sync-review-dev1-20260914-e
2026-09-14 17:56:33 +08:00
Silent1566
5515bca540 Merge remote-tracking branch 'origin/beta' into dev1 2026-09-14 17:50:53 +08:00
Silent1566
f7a4f74efc
Merge pull request #275 from Silent1566/dev2
修复电视端最近观看卡片重复显示已看时长
2026-09-14 17:46:29 +08:00
Silent1566
9de96f851c test: remove stale FFmpeg VC-1 Java assertions
Verification: ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests io.github.anilbeesetti.nextlib.media3ext.ffdecoder.FfmpegVc1SupportTest --no-daemon: BUILD SUCCESSFUL

Task-Guard: vc1-failing-assertions-removal
2026-09-14 17:36:31 +08:00
www.xueximeng.com
bc2b3b284d docs: assess Exo libass integration and MPV subtitle surface reuse
Verification: Research document validation PASS: 22 source entries, 18 proposed acceptance scenarios, 9 local links, 7 API-pinned full revisions, 3 archive hashes, MPV SurfaceView/EGL reuse boundary, credential scan; no production edits or runtime tests

Task-Guard: E4-LIBASS-research
2026-09-14 17:14:48 +08:00
Silent1566
7605a7d589 fix(leanback): remove duplicate watched time on recent cards
Verification: :app:compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; leanback historyProgress references removed

Task-Guard: ui-remove-duplicate-history-watched
2026-09-14 16:26:16 +08:00
Silent1566
7e8fdbd4c2
Merge pull request #274 from Silent1566/dev1
合并 beta 接口容灾并修复复评回归
2026-09-14 16:08:25 +08:00
Silent1566
7e608688ae merge: 合并 beta 接口容灾并修复复评回归
Verification: Mobile Arm64 targeted tests and Leanback SearchResultDownFocusTest passed (BUILD SUCCESSFUL; 46s and 1m), including BackupPreferenceFilterTest, GlobalHistorySettingSourceTest, PlayerDisplaySettingSyncTest, VideoAspectUiSourceTest, TmdbDetailActivityLayoutTest, PlayerControlFocusIntegrationTest, TmdbUIAdapterTest; both flavor Java compilations passed.

Task-Guard: beta-sync-review-dev1-20260914-d
2026-09-14 16:04:12 +08:00
Silent1566
0312720923
Merge pull request #273 from Silent1566/dev2
feat: 默认启用 VOD 接口自动容灾
2026-09-14 15:36:46 +08:00
Silent1566
f2d0d0e11e merge: 合并 beta 最新代码并完成第二轮复评修复
Verification: origin/beta 0b43e10040 merged; PlayerControlFocusIntegrationTest, TmdbUIAdapterTest, SearchResultDownFocusTest passed; Mobile/Leanback Arm64 Java compilation succeeded; git diff --check and task guard check passed

Task-Guard: beta-sync-review-dev1-20260914-c
2026-09-14 15:32:03 +08:00
Silent1566
968aedb881 docs: record short display fix evidence and completion status
Verification: fix commit cf1a3eef83 created; annotated tag recovery/tv-short-display-dead-20260914/20260914143520-cf1a3eef83 created; testMobileArm64_v8aDebugUnitTest PlayerControlFocusIntegrationTest passed; compileLeanbackArm64_v8aDebugJavaWithJavac passed; git diff --cached --check passed

Task-Guard: tv-short-display-dead-20260914-commit
2026-09-14 15:30:32 +08:00
Silent1566
cf1a3eef83 fix(tv): restore short display confirm action
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.PlayerControlFocusIntegrationTest; :app:compileLeanbackArm64_v8aDebugJavaWithJavac; git diff --cached --check

Task-Guard: tv-short-display-dead-20260914
2026-09-14 15:24:45 +08:00
www.xueximeng.com
4a447f26e5 fix(settings): correct update dialog theme and sizing on TV
Verification: PASS: layout XML parsed; Leanback armeabi-v7a debug APK assembled and Mobile arm64 debug Java compiled in one Gradle run (/private/tmp/webhtv-update-settings-tv-build.log); installed successfully on 10CF6H1D2L0009S; update settings displayed readable controls and a fully visible Save button (/private/tmp/webhtv-update-settings-oci-after.png). User accepted the displayed result and requested a tag; optional further scenarios closed.

Task-Guard: update-settings-tv-layout-20260914
2026-09-14 15:23:51 +08:00
Silent1566
484bdc9dd9 docs: 记录接口容灾默认自动模式复审
Verification: Focused tests InterfaceFailoverPolicyTest/StateTest/OrderStoreTest/BackupPreferenceFilterTest passed; Mobile and Leanback Arm64 javac passed; git diff --check passed

Task-Guard: failover-default-auto-review-20260914
2026-09-14 15:21:00 +08:00
Silent1566
ca9febe024 feat: default VOD interface failover to auto
Verification: Focused tests: InterfaceFailoverPolicyTest BUILD SUCCESSFUL

Task-Guard: failover-default-auto-20260914
2026-09-14 15:01:38 +08:00
www.xueximeng.com
ce2baffcff fix(settings): preserve playback performance focus after edits
Verification: PASS: Mobile and Leanback Arm64 debug Java compilation in one Gradle run; log /private/tmp/webhtv-playback-performance-focus-20260914-compile.log. Reviewed common and advanced row restoration by option ID and scroll restoration after layout. No ADB device connected; device interaction not exercised.

Task-Guard: playback-performance-focus-20260914
2026-09-14 14:35:21 +08:00
Silent1566
c89b166e6e feat: restore VOD interface failover from backup
Verification: Focused tests: InterfaceFailoverStateTest/PolicyTest/OrderStoreTest/BackupPreferenceFilterTest BUILD SUCCESSFUL; compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL

Task-Guard: failover-copy-dev2-20260914
2026-09-14 14:31:22 +08:00
www.xueximeng.com
8965c0ddda feat(diagnostics): add bounded playback log foundation
Verification: AV-DIAG-01 D0: 37 distinct targeted tests; final 8 concurrency/storage tests passed; Mobile and Leanback arm64 Java compile passed; final catvod toggle compile passed; actual embedded JS incremental/reset/escaping checks passed; 3 production exporter fixtures with SHA-256 and redaction passed; 19 sections/62 events/25 scenarios and checkpoint validation passed. No connected Android device; device playback/performance acceptance pending.

Task-Guard: AV-DIAG-01-D0
2026-09-14 13:45:41 +08:00
Silent1566
0b43e10040
Merge pull request #272 from Silent1566/dev4
合并beta分支最新代码并审查修改
2026-09-14 13:41:12 +08:00
Silent1566
27b02067e0 Merge remote-tracking branch 'origin/beta' into dev4 2026-09-14 13:17:22 +08:00
Silent1566
bd91605213
Merge pull request #271 from Silent1566/dev3
合并远端beta分支最新代码后评审已修改的代码
2026-09-14 13:16:39 +08:00
Silent1566
1496b877fe Merge remote-tracking branch 'origin/beta' into dev3 2026-09-14 12:53:26 +08:00
Silent1566
93b0e99c93 fix: keep focused TV search result card fully visible
Verification: Gradle compileLeanbackArm64_v8aDebugJavaWithJavac passed; focused source assertions confirm RecyclerView-coordinate alignment scrolls the focused result card fully into view

Task-Guard: search-result-down-card-bottom-alignment
2026-09-14 12:43:18 +08:00
Silent1566
937018f44f fix: reveal shell while loading for TMDB detail page
Verification: Built and installed APK on 192.168.50.3:5559. Changes: VideoActivity.java modified to reveal shell when coming from TMDB detail page.

Task-Guard: fix-enhanced-play-theme-overlay
2026-09-14 12:42:50 +08:00
Silent1566
ea9b666752 修复炫彩详情首次播放提前覆盖详情页
Verification: git diff --check; compileMobileArm64_v8aDebugJavaWithJavac offline BUILD SUCCESSFUL; compileLeanbackArm64_v8aDebugJavaWithJavac offline BUILD SUCCESSFUL; compileMobileArmeabi_v7aDebugJavaWithJavac offline BUILD SUCCESSFUL; compileLeanbackArmeabi_v7aDebugJavaWithJavac offline BUILD SUCCESSFUL; assembleMobileArm64_v8aDebug offline BUILD SUCCESSFUL; implementation defers enhanced/player fullscreen until inline video size is available, preventing pre-frame playerPanel overlay

Task-Guard: fix-enhanced-play-remaining-overlay
2026-09-14 09:58:11 +08:00
Silent1566
5e6933b520
Merge pull request #270 from Silent1566/dev1
合并 beta 最新代码并完成 dev1 复评修复
2026-09-14 08:54:02 +08:00
Silent1566
242f7368db fix: 清理 beta 合并后的重复导入
Verification: 修复 merge 引入的 PlaybackActivity 重复 DiscMenuDialog import;Mobile/Leanback Arm64 Java 编译 BUILD SUCCESSFUL;git diff --check、三套 strings 重复 ID、APP_PREFS 138 项唯一性、任务新增重复 import 与 task guard check 均通过;逐文件复评 origin/beta...HEAD 的 19 个当前修改路径未发现其他阻断问题;VC-1 两个既有失败已独立归因记录。

Task-Guard: beta-sync-review-dev1-20260914-final-audit
2026-09-14 02:04:04 +08:00
Silent1566
f6ffd716e7 docs: 记录 dev1 VC-1 失败归因
Verification: 祖先提交 636dbcea31 已记录合并前相同的两个 VC-1 失败;合并前父提交到 HEAD 的 VC-1 测试、版本锁和媒体锁 blob 一致;相关路径无 diff;git diff --check 与 guard check 通过;PR #270 保持 OPEN/CLEAN。

Task-Guard: beta-sync-review-dev1-20260914-vc1-classification
2026-09-14 01:53:36 +08:00
Silent1566
2805a8df89 fix: 完成 dev1 合并 beta 后复评修复
Verification: 相关193项移动端源测试全部通过;Mobile/Leanback Arm64 Java 编译 BUILD SUCCESSFUL;git diff --check、重复监听器/资源/APP_PREFS检查与task_guard check通过;VC-1当前锁定依赖provenance不一致已记录于docs/beta-sync-review-dev1-20260914.md

Task-Guard: beta-sync-review-dev1-20260914-final
2026-09-14 01:43:10 +08:00
www.xueximeng.com
2ec5afd8cc fix(mpv): bound FEL renderer warmup and gate push descriptors
Verification: P2-4 section 9.17: old VO 900ms negative reproduced; real VO/Vulkan ASan+UBSan, 1200 fresh pushes and 240 handoffs, cancellation/default isolation and source-patch checks passed; both ABI builds/ELF/exports and 18 unchanged libraries passed; 13 Java tests and TV32/Mobile64 APK assets/v2 signatures/ZIP passed; checkpoint verifier passed. Target-TV pixels, push support and real-time performance pending; no overall device acceptance. Evidence: /private/tmp/webhtv-fel-warmup-push.22C7vl/

Task-Guard: P2-4-fel-warmup-push
2026-09-14 00:42:39 +08:00
Silent1566
fecdda30a2 fix: resolve beta merge duplicate declarations and resources
Verification: Merged origin/beta c5a492261b into dev1; fixed duplicate blue-ray setting handlers, duplicate historyProgress declarations, duplicate resource IDs/strings, and duplicate MpvPlayer switch case. Static diff/marker audits pass; resource merge and both Arm64 Java compilation complete; unit-test task reached execution but existing beta source-test suite has 18 unrelated failures.

Task-Guard: beta-sync-review-dev1-20260914-fix
2026-09-14 00:30:37 +08:00
Silent1566
f76a5af0e9 fix: keep focused TV search result card fully visible
Verification: Gradle compileLeanbackArmeabi_v7aDebugJavaWithJavac passed; focused source assertions confirm RecyclerView-coordinate alignment scrolls the focused result card fully into view

Task-Guard: search-result-down-card-visibility
2026-09-14 00:10:39 +08:00
Silent1566
c742953845 Merge beta into dev1: sync latest beta code and resolve conflicts 2026-09-14 00:03:03 +08:00
Silent1566
1f0991bfdf fix: follow focus on TV search result down navigation
Verification: Gradle compileLeanbackArmeabi_v7aDebugJavaWithJavac passed; focused source assertions confirm immediate down navigation, deferred scroll+focus, and stale-request invalidation

Task-Guard: search-result-down-focus-follow
2026-09-13 23:16:56 +08:00
www.xueximeng.com
ce10d5c15e fix(mpv): refresh FEL frame commands and trace frame ordering
Verification: P2-4 9.16: actual-function ASan/UBSan cache/order and 240-frame handoff PASS; 1200 fresh recordings, no replay; final source/patch PASS; arm64+armv7 ELF/exports PASS with 18 unchanged libraries; 13 Java tests PASS; TV32/Mobile64 APK assets/signatures/ZIP PASS; checkpoint PASS. Evidence: /private/tmp/webhtv-fel-frame-order.sUwUpN. TV32 SHA256 4971498a956a723cf348592dc4b228f595efdda56a77a884afb51fec05645722. Device pixels/performance remain unverified.

Task-Guard: P2-4-fel-vk-reuse
2026-09-13 22:54:43 +08:00
Silent1566
6a2af5f43d 移除炫彩详情播放页多余的加载遮罩
Verification: compileMobileArm64_v8aDebugJavaWithJavac offline BUILD SUCCESSFUL; compileLeanbackArm64_v8aDebugJavaWithJavac offline BUILD SUCCESSFUL; compileMobileArmeabi_v7aDebugJavaWithJavac offline BUILD SUCCESSFUL; compileLeanbackArmeabi_v7aDebugJavaWithJavac offline BUILD SUCCESSFUL

Task-Guard: remove-enhanced-play-extra-loading
2026-09-13 21:43:42 +08:00
Silent1566
c5a492261b
Merge pull request #269 from Silent1566/dev4
合并 dev4:新增游戏动作卡并加固 WebView 安全
2026-09-13 21:34:16 +08:00
Silent1566
d99aab8069 fix: harden GameWebActivity webview security (disable file access and mixed content)
Verification: GameWebActivity security settings hardened to match CatWebActivity/HomeWebController: disabled file/content access and mixed content. Unit test and compile passed.

Task-Guard: BETA-SYNC-REVIEW-DEV4-FINAL-20260913
2026-09-13 21:21:10 +08:00
Silent1566
29d23c01e3 fix: deduplicate APP_PREFS in Backup.java; sync with beta and review
Verification: GameContentHandlerTest 5/5; mobileArm64_v8aDebug and leanbackArm64_v8aDebug Java compilation passed; Backup.java: APP_PREFS deduplicated, no duplicates, compiles successfully

Task-Guard: BETA-SYNC-REVIEW-DEV4-20260913
2026-09-13 21:08:41 +08:00
Silent1566
86b4f6ae61 feat: add game mode action cards
Verification: GameContentHandlerTest 5/5; mobileArm64_v8aDebug and leanbackArm64_v8aDebug Java compilation passed

Task-Guard: GAME-MODE-20260913
2026-09-13 20:29:12 +08:00
Silent1566
5dffe1a093
Merge pull request #267 from Silent1566/dev3
修复 Backup 偏好键重复导致的备份失败
2026-09-13 19:51:54 +08:00
Silent1566
21c20abb65 Merge remote-tracking branch 'origin/beta' into dev3 2026-09-13 19:48:00 +08:00
Silent1566
2d58d90856
Merge pull request #268 from Silent1566/dev4
修复阅读历史恢复并合并 beta 最新代码
2026-09-13 19:11:09 +08:00
Silent1566
910a7b819a fix(mpv): avoid unavailable audio mediacodec route
Verification: 日志证据:route=false 时 aac_mediacodec 出现持续 MediaCodec port backpressure,且播放位置在约30秒仅前进约5秒;修复后 route=false 使用 aac,mp3,amrnb,amrwb,明确压缩输出路由仍使用原硬件优先。验证:bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests androidx.media3.mpvplayer.MpvAudioDecoderPolicyTest --no-daemon(BUILD SUCCESSFUL,3 tests passed,Mobile Arm64 Java 编译通过);git diff --check;task_guard check。未执行设备验证。

Task-Guard: quickfix-mpv-audio-stall-20260913
2026-09-13 19:05:55 +08:00
Silent1566
d67e92aab6 merge: 合并 beta 最新代码并复评阅读历史修复 2026-09-13 18:13:07 +08:00
Silent1566
396833c4a9 fix(reader): restore novel paged history subpage
Verification: git diff --check passed; ReaderPlaybackRoutingSourceTest passed; available memory 2.1GiB before build; :app:assembleMobileArm64_v8aDebug passed; APK installed on 192.168.50.3:5561; simulator logged saveProgress index=1 anchor=8/10 then restore index=1 anchor=8/10 and UI showed 9/10; no reader JS/runtime error observed

Task-Guard: novel-pagination-history-restore
2026-09-13 18:09:48 +08:00
Silent1566
00c9dc4b6b fix: remove duplicate Backup preference keys
Verification: adb 192.168.50.3:5563 backup succeeded: /storage/emulated/0/TV/bak-20260913-1758.zip

Task-Guard: backup-failure-20260913
2026-09-13 18:00:10 +08:00
Silent1566
626833c6df fix(reader): restore missing monotonic clock for comic history
Verification: 已在192.168.50.3:5561日志确认原始ReferenceError;补丁后单测BUILD SUCCESSFUL,mobileArm64_v8aDebug APK构建成功并安装;APK assets/reader.html包含nowMs函数;git diff --check通过

Task-Guard: comic-history-nowms-restore
2026-09-13 17:06:33 +08:00
Silent1566
30bbfc3296
Merge pull request #266 from Silent1566/dev3
合并 dev3 到 beta:设置页栅格与焦点导航修复
2026-09-13 16:57:24 +08:00
Silent1566
433eece7c2 fix(setting): restore DoH upward focus path
Verification: 已合并 origin/beta@3e92127ee0 且无冲突;最终相对 beta 仅 activity_setting.xml;aapt2 编译、XML 解析、nextFocus 引用、完整方向焦点图、git diff --check 均通过;Gradle 资源任务因系统内存/守护进程挂起中止

Task-Guard: beta-sync-review-dev3-close-20260913
2026-09-13 16:50:15 +08:00
Silent1566
bc0d3af01e Merge remote-tracking branch 'origin/beta' into dev3 2026-09-13 16:45:53 +08:00
Silent1566
8fc600731a fix(setting): correct DoH focus return path
Verification: aapt2 compile activity_setting.xml;XML parse;nextFocus 引用及设置页焦点映射静态校验通过;Gradle 资源任务因系统内存/守护进程挂起中止

Task-Guard: beta-sync-review-dev3-20260913
2026-09-13 16:44:17 +08:00
Silent1566
9b280218e0 fix(reader): 修复漫画横向翻页历史节点丢失
Verification: ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.ReaderPlaybackRoutingSourceTest BUILD SUCCESSFUL

Task-Guard: comic-horizontal-history-restore
2026-09-13 14:01:28 +08:00
Silent1566
7768386d28 fix(setting): finalize two-card row width [setting-two-card-final-width-20260913]
Verification: 布局补丁已应用:两卡行最后一张卡 marginEnd=0;无痕/DoH 行删除隐形第三列;git diff --check 通过;待编译安装后截图确认

Task-Guard: setting-two-card-final-width-20260913
2026-09-13 13:56:18 +08:00
Silent1566
e6eeda4d18 fix(setting): let two-card rows fill full width [setting-two-card-fill-20260913]
Verification: 布局补丁已应用:TMDB/AI、备份/恢复、缓存/关于行删除不可见第三列占位;git diff --check 通过;待编译安装后验证两张卡片铺满整行

Task-Guard: setting-two-card-fill-20260913
2026-09-13 13:50:21 +08:00
www.xueximeng.com
dc14016385 mpv: isolate FEL performance logs and add nonblocking stage timings
Verification: P2-4 section 9.14; /private/tmp/webhtv-fel-perf.C10X7r: native-contract ASan/UBSan including fence-before-query/no-WAIT; 23 JUnit tests; two-ABI builds/ELF/public exports; only 2 libmpv changed and 18 libraries identical; final APK assets/signatures/ZIP passed; patch source identity and diff/checkpoint passed. Target-TV playback/performance remains pending, not accepted.

Task-Guard: P2-4-fel-steady-perf
2026-09-13 13:08:42 +08:00
Silent1566
781c1e8cac fix(setting): make sparse rows use uniform three-column grid [setting-two-column-uniform-20260913]
Verification: 修改后 git diff --check 通过;TMDB/AI、备份/恢复、缓存/关于行的第三列占位已改为 invisible,保持两卡行与三卡行同宽栅格;需安装 APK 后 UI 快照确认卡片边界

Task-Guard: setting-two-column-uniform-20260913
2026-09-13 12:07:54 +08:00
Silent1566
3e92127ee0
Merge pull request #265 from Silent1566/dev2
合并 dev2 最新修复与上游资源同步到 beta
2026-09-13 11:54:46 +08:00
Silent1566
cf2283e386 docs: 收口 dev2 beta 合并复评记录
Verification: beta无新提交;未推送3个提交已有专项/复评记录;verify_mpv_native_assets通过;git diff --check通过;工作树干净

Task-Guard: BETA-SYNC-REVIEW-DEV2-20260913
2026-09-13 11:48:11 +08:00
Silent1566
db3af69a16 fix(mpv): observe Blu-ray menu active property
Verification: Leanback arm64 debug Java compile passed; observe and handler present

Task-Guard: P9-MPV-BLURAY-MENU
2026-09-13 11:39:13 +08:00
www.xueximeng.com
1620bac156 mpv: separate FEL cold initialization from cancellable frame handoff
Verification: 日志42续修:core/producer/async host ASan+UBSan、C++契约、静态接线、双ABI构建/ELF/公开导出、2份libmpv变化且18依赖不变、TV32/Mobile64 APK逐库与v2签名、guard/checkpoint均通过;证据 /private/tmp/webhtv-fel-startup.hjGizG/。用户明确要求保存当前最新源码/native候选;目标电视实播未验收,不代表全部故障已解决。

Task-Guard: P2-4-fel-vo-handoff
2026-09-13 11:23:03 +08:00
Silent1566
a4db768c26 fix(setting): restore full-width ad row focus [setting-ad-row-restore-20260913]
Verification: 设备 192.168.50.3:5559 的 SettingActivity 中,com.silent.android.webhtv:id/ad 边界为 [38,397][1882,460];连续向下导航后 focused=true、clickable=true;git diff --check 通过

Task-Guard: setting-ad-row-restore-20260913
2026-09-13 11:14:21 +08:00
Silent1566
7dc58af1b0 merge: integrate C4 upstream source round 3 (2026-09-13)
Verification: mobile/leanback compile + 8 targeted unit tests + git diff --check (/tmp/c4-mobile-compile4.log, /tmp/c4-leanback-tests3.log)

Task-Guard: C4-ROUND3-UPSTREAM-SRC2
2026-09-13 05:57:18 +08:00
www.xueximeng.com
0a82dc13e2 mpv: checkpoint FEL producer handoff with unresolved playback stalls
Verification: 候选恢复快照:定向host ASan/UBSan、双ABI构建/ELF/导出、两APK逐库及签名通过;用户日志41反馈起播成功率提高但偶发音视频解码失败,所有播放仍严重掉帧。用户明确要求立即保存最新源码及native,不表示电视验收通过。

Task-Guard: P2-4-fel-buffer-progress
2026-09-13 02:55:08 +08:00
Silent1566
f6c5a5c586 docs: record upstream merge closure
Record the final merge parents, recovery tag, binary hash and Java verification evidence.
2026-09-13 02:00:43 +08:00
Silent1566
65facf4bcb merge: synchronize fish2018 main with binary override and Java merge
Verification: GitHub API and local upstream/main frozen at fc62397591; 18 upstream .so hashes match exactly; no conflict markers; verify_mpv_native_assets.sh --require-elf passed; Mobile/Leanback Arm64 Java compilation and selected JVM tests BUILD SUCCESSFUL; git diff --check passed; no APK was packaged

Task-Guard: merge-upstream-binary-override-java-merge
2026-09-13 01:59:33 +08:00
Silent1566
154e003520 chore(binary): sync upstream arm64/armeabi mpv and binary assets
Verification: arm64 assembleMobileArm64_v8aDebug BUILD SUCCESSFUL; armeabi build blocked by upstream Chaquopy TLS/network, unrelated to binary diff

Task-Guard: UPSTREAM-BIN-SYNC
2026-09-13 01:40:13 +08:00
Silent1566
da34bfc400 Finish C4 task guard: record completion and prepare for dev1 upstream merge
Verification: Trivial change to record task guard finish for C4; base HEAD updated to current dev1 HEAD; no other changes

Task-Guard: C4
2026-09-13 00:49:58 +08:00
www.xueximeng.com
cbb02fa4c4 fix(mpv): checkpoint pure-BL FEL reliability candidate
Verification: User explicitly requested latest tested candidate commit/tag as recovery snapshot. Existing host packet/RPU/lease/concurrency tests and both ABI ELF/APK checks passed (docs/P2-4-mpv-android-fel.md section 9.10). TV logs 39/40 report severe stutter and decoding failure: playback and performance acceptance FAILED; snapshot only, not a completed fix.

Task-Guard: P2-4-fel-reliability
2026-09-12 21:47:50 +08:00
Silent1566
dcc46b90af fix(setting): align ad setting column with three-column grid [setting-layout-column-alignment-20260912]
Verification: Layout change applied to activity_setting.xml: ad setting now uses horizontal LinearLayout with weight distribution to align with three-column grid. Build successful: :app:processLeanbackArm64_v8aDebugResources passed. Task guard check passed.

Task-Guard: setting-layout-column-alignment-20260912
2026-09-12 21:37:39 +08:00
Silent1566
0f6912a0c4
Merge pull request #264 from Silent1566/dev2
合并 beta 并修复阅读进度与 PDF 异步渲染
2026-09-12 21:03:33 +08:00
Silent1566
d160b40a84 fix(reader): stabilize progress and PDF rendering 2026-09-12 20:57:35 +08:00
Silent1566
009a35947d Merge remote-tracking branch 'origin/beta' into dev2 2026-09-12 20:47:04 +08:00
Silent1566
4a3fc03533 feat(reader): 升级小说和漫画阅读界面
Verification: 已规范化 reader.html 行尾并通过 git diff --check;已确认小说顶部/底部工具栏、章节抽屉和设置面板,以及漫画控制栏、浏览设置和模式切换等 UI 合约存在;抽取全部内联 JavaScript 后通过 node --check 语法校验

Task-Guard: reader-ui-upgrade
2026-09-12 20:19:14 +08:00
Silent1566
8d6fde4c80
Merge pull request #263 from Silent1566/dev4
修复 EXO 起播定位竞争并完成 beta 合并复评
2026-09-12 20:00:36 +08:00
Silent1566
20cb134128 docs: 完成�� dev4 合并 beta 后复评记录
Verification: 已合并 origin/beta 6750b21dc4 且无冲突;完成相对 origin/beta 的全部差异复评与 git diff --check;bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.VideoActivityLayoutTest 验证通过(BUILD SUCCESSFUL in 33s)

Task-Guard: beta-sync-review-dev4-20260912-2
2026-09-12 19:56:27 +08:00
Silent1566
32877c1bbb Merge remote-tracking branch 'origin/beta' into dev4 2026-09-12 19:53:05 +08:00
Silent1566
a123124c44 fix(player): avoid EXO startup seek race
Verification: git diff --check passed; :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.VideoActivityLayoutTest passed (154 tests); Mobile Arm64 Java compilation passed

Task-Guard: fix-exo-startup-seek-race
2026-09-12 19:12:24 +08:00
Silent1566
6750b21dc4
Merge pull request #262 from Silent1566/dev2
合并 beta 最新代码并修复 Exo 缓冲卡死恢复
2026-09-12 19:04:52 +08:00
Silent1566
eb7e6015c4 docs: 校准 dev2 beta 交付提交记录
Verification: 已记录代码提交 00c171160e 与文档收口提交 e47fa3dee;仅为最终远端拉取后的文档一致性收口,git diff --check 通过

Task-Guard: beta-sync-review-dev2-20260912-finalize
2026-09-12 18:16:05 +08:00
Silent1566
e47fa3dee3 docs: 收口 dev2 beta 合并复评交付记录
Verification: PR #262 已创建且 OPEN/CLEAN;最终 git fetch/pull --ff-only origin dev2 为 Already up to date;工作树干净

Task-Guard: beta-sync-review-dev2-20260912-followup-close
2026-09-12 18:15:07 +08:00
Silent1566
00c171160e merge: 合并 beta 最新代码并完成 dev2 缓冲卡死复评 (2026-09-12)
Verification: origin/beta@07fb0b5e13 无冲突合入;修复 Exo buffering 看门狗接线、非 Exo 作用域及 discontinuity 轮询顺序;:app:testMobileArm64_v8aDebugUnitTest 定向测试 BUILD SUCCESSFUL(87 actionable tasks)

Task-Guard: beta-sync-review-dev2-20260912-followup
2026-09-12 18:12:35 +08:00
Silent1566
51f8878dc7 style(tv): 统一设置页栅格与焦点导航
Verification: XML 解析、焦点引用、前三行保持及三列槽位静态检查通过;:app:processLeanbackArm64_v8aDebugResources 构建成功,54 个任务中 7 个执行、47 个为最新状态

Task-Guard: setting-layout-grid-focus-20260912
2026-09-12 18:01:53 +08:00
Silent1566
07fb0b5e13
Merge pull request #260 from Silent1566/dev1
EXO:移除已废弃的 FFmpeg 模式设置
2026-09-12 17:30:00 +08:00
Silent1566
4a66957596
Merge pull request #261 from Silent1566/dev4
合并 dev4:统一分集客串演员卡片并稳定移动端滚动
2026-09-12 17:19:48 +08:00
Silent1566
fe08b1c167 docs: 完成 dev4 合并 beta 后复评记录
Verification: 已合并 origin/beta ccd608c503 且无冲突;完整差异两轮复评通过;git diff --check 通过;�:app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.dialog.EpisodeDetailDialogThemeTest 构建与测试成功

Task-Guard: beta-sync-review-dev4-20260912
2026-09-12 17:13:19 +08:00
Silent1566
cf8c95b105 Merge remote-tracking branch 'origin/beta' into dev4 2026-09-12 17:08:42 +08:00
Silent1566
20dcf31245 fix(player): recover from buffering stalls
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.player.exo.ExoBufferingStallWatchdogTest: BUILD SUCCESSFUL in 1m 4s; 87 actionable tasks

Task-Guard: E-SP8-FREEZE-FIX
2026-09-12 16:11:13 +08:00
Silent1566
b6b18ac1dd fix(tv): stabilize mobile episode detail bottom scroll
Verification: mobile EpisodeDetailDialogThemeTest passed; mobile debug APK packaged successfully; runtime check on 192.168.50.3:5555 after scrolling the episode detail to the bottom confirmed guest cards remain fully visible without rebound clipping

Task-Guard: tmdb-episode-guest-bottom-scroll
2026-09-12 16:10:42 +08:00
Silent1566
d42f2de6c8 docs: 收口 dev1 beta 合并复评交付记录
Verification: 已复评 origin/beta 祖先关系与 c2dcf52 全部差异;运行时/API/UI/资源引用闭合、XML 解析、既有 Mobile/Leanback Java 编译和收窄测试证据均通过;dev1、原子 recovery tag 与 PR #260 交付记录已核对

Task-Guard: beta-sync-review-dev1-20260912-close
2026-09-12 15:42:13 +08:00
Silent1566
6a002d29f7 fix(tv): unify cinema episode guest cards
Verification: mobile EpisodeDetailDialogThemeTest passed; mobile and leanback main compilation passed; assembleMobileArm64_v8aDebug succeeded; installed APK runtime check on 192.168.50.3:5555 confirmed no cancel button and cinema guest cards are horizontal left-photo/right-text with outer-card-only rounding

Task-Guard: tmdb-episode-guest-horizontal-card
2026-09-12 15:36:59 +08:00
Silent1566
c2dcf52b56 refactor(exo): remove obsolete FFmpeg mode setting
Verification: git diff --check; no obsolete FFmpeg mode references outside audit record; real Exo FFmpeg renderer references retained; Mobile/Leanback Java compilation passed; focused Mobile/Leanback PlayerManagerTest, PlayerDisplaySettingSyncTest, and PlayerSettingTest passed; unrelated VideoActivityLayoutTest leanbackSpeedBoostReleaseIsGuarded failure recorded in task document

Task-Guard: E-ROLLBACK-EXO
2026-09-12 15:15:36 +08:00
Silent1566
ccd608c503
Merge pull request #259 from Silent1566/dev1
合并 beta 最新代码并完成 dev1 全量复评(2026-09-12)
2026-09-12 14:40:12 +08:00
Silent1566
f1c15ef025 merge: 合并 beta 最新代码并完成 dev1 复评 (2026-09-12)
Verification: 已抓取 origin/beta@81435e97ea 并合并;解决 TmdbDetailActivity.java/TmdbDetailActivityLayoutTest.java 两个冲突;Mobile 定向测试 159 项通过、Mobile/Leanback Arm64 Java 编译通过;XML 解析、git diff --cached --check、无未解决路径、task_guard check 通过;Leanback 测试过滤器无匹配已记录为命令范围问题而非代码回归

Task-Guard: beta-sync-review-dev1-20260912
2026-09-12 14:32:01 +08:00
Silent1566
667992b22e fix(tv): round cinema episode guest portraits
Verification: mobile targeted EpisodeDetailDialogThemeTest 7/7 passed; assembleMobileArm64_v8aDebug succeeded; leanback production Java compile succeeded (leanback test filter had no matching test source)

Task-Guard: tmdb-episode-guest-photo-rounded
2026-09-12 14:13:33 +08:00
Silent1566
81435e97ea
Merge pull request #258 from Silent1566/dev2
合并 beta 最新代码并完成 dev2 复评(2026-09-12)
2026-09-12 13:56:54 +08:00
Silent1566
d04d4adc57 Merge beta branch latest code to dev3 2026-09-12 13:51:45 +08:00
Silent1566
38ff48d8d1 docs: 收口 dev2 beta 合并复评交付记录
Verification: 文档已记录原子提交 4353f020eb541ee74a2be98f1b5ce20eef3f4021、恢复标签 recovery/beta-sync-review-dev2-20260912/20260912134415-4353f020eb54、中文 PR #258、最终 fetch/pull Already up to date 及 HEAD/origin/dev2/beta SHA;仅文档变更,无需重跑构建

Task-Guard: beta-sync-review-dev2-20260912-close
2026-09-12 13:51:22 +08:00
Silent1566
4353f020eb merge: 合并 beta 最新代码并完成 dev2 复评 (2026-09-12)
Verification: 无冲突合并 origin/beta@7c325e4a04891fc1df224d359039998500ec4235;移动端资源处理与 AboutDialogLayoutTest(10)/TmdbDetailActivityLayoutTest(121) 全部通过;Leanback 资源处理通过;5 个 XML 可解析;验证后复评无问题

Task-Guard: beta-sync-review-dev2-20260912
2026-09-12 13:44:15 +08:00
Silent1566
b0f0343664 fix(tmdb): 完整显示光影剧幕圆角海报
Verification: git diff --check;:app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailActivityLayoutTest(120 tests,0 failures,0 errors)

Task-Guard: tmdb-poster-card-rounded-correction-20260912
2026-09-12 13:41:53 +08:00
Silent1566
7c325e4a04
Merge pull request #257 from Silent1566/dev3
修复 TV 关于页面焦点导航与高亮
2026-09-12 12:37:05 +08:00
Silent1566
42d6abe02e fix(tmdb): 统一光影剧幕海报圆角显示
Verification: git diff --check;:app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailActivityLayoutTest(BUILD SUCCESSFUL,30s)

Task-Guard: tmdb-cinema-poster-rounded-20260912
2026-09-12 11:30:48 +08:00
Silent1566
8f87974620 fix(tmdb): 统一光影剧幕剧照栏间距
Verification: git diff --check;:app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailActivityLayoutTest(BUILD SUCCESSFUL,52s)

Task-Guard: tmdb-cinema-photo-rail-spacing-20260912
2026-09-12 11:18:03 +08:00
Silent1566
30fff5f4ff style(tv): 增强关于页面按钮焦点高亮
Verification: dialog_about.xml 及四个专用 selector 均可正常解析;检查更新、加速源和设置按钮聚焦态均为 #0B57D0 深蓝背景与 #FFFFFF 白色前景;git diff --check 通过

Task-Guard: tv-about-primary-focus-highlight
2026-09-12 11:16:23 +08:00
Silent1566
e82f50cbaa fix(tv): 修复我已知悉按钮上键焦点
Verification: dialog_about.xml 可正常解析;confirm 的 android:nextFocusUp 显式指向 checkUpdate;githubProxy 原有焦点关系未回归;git diff --check 通过

Task-Guard: tv-about-confirm-up-focus
2026-09-12 11:09:50 +08:00
Silent1566
810f0e2ab3
Merge pull request #256 from Silent1566/release/v5.6.0-beta-202609111556
release: v5.6.0-beta-202609111556 正式发布
2026-09-12 10:59:57 +08:00
Silent1566
e8056e5ad4 fix(tv): 修复检查更新上键焦点导航
Verification: dialog_about.xml 可正常解析;githubProxy 的 android:nextFocusUp 显式指向 checkUpdate;git diff --check 通过

Task-Guard: tv-about-update-focus
2026-09-12 10:15:08 +08:00
Silent1566
4ee05ac28c
Merge pull request #252 from Silent1566/dev1
合并 beta 最新代码并复评 E-SP8 短剧队列
2026-09-12 10:07:19 +08:00
Silent1566
b9c2861c9c
Merge pull request #253 from Silent1566/dev2
修复炫彩详情选集元信息并新增一键构建安装脚本
2026-09-12 09:53:34 +08:00
Silent1566
d28a968b60
Merge pull request #254 from Silent1566/dev3
合并 beta 最新代码并完成 dev3 复评
2026-09-12 09:53:09 +08:00
Silent1566
d1fb2fdca0
Merge pull request #255 from Silent1566/dev4
修复炫彩详情选集网格起始对齐
2026-09-12 09:50:23 +08:00
www.xueximeng.com
ec68966c1d mpv: avoid synchronous audio probes in unrelated log callbacks
Verification: 18 targeted tests passed; leanback armv7 APK build passed; TV trace p-w3uti8-1 confirms immediate native diagnostics and removal of unrelated PCM audio-property probes; FEL native/track-query failures remain explicitly open

Task-Guard: P2-4-log-stall
2026-09-12 09:01:32 +08:00
www.xueximeng.com
792c1f880b mpv: checkpoint opt-in DV7 FEL reconstruction (known bugs)
Add the manually selected FEL dual-layer path and its ARM native assets.
Preserve existing defaults and keep the pre-existing app/.cxx files out.

Status: user-requested snapshot with known bugs; device FEL, lifecycle,
and performance acceptance remain pending. Not release-ready.
Task-Record: docs/P2-4-mpv-android-fel.md
Upstream-Source: FongMi/mpv@06ec6e1746

Verification: 57 targeted JUnit tests passed; Mobile arm64 and Leanback armv7 Java/APK builds passed; both ARM native builds, final ELF/assets/exported symbols and APK asset hashes passed; protected dirty paths/scope check passed. User explicitly requested commit/tag of the current snapshot with known remaining bugs. Device FEL/lifecycle/performance acceptance is NOT complete; this is a known-bug checkpoint, not a release or acceptance claim.

Task-Guard: P2-4
2026-09-12 07:41:10 +08:00
www.xueximeng.com
fc62397591 fix(drive): prioritize 115 expired share status over metadata
Verification: JDK21 DriveCheckServiceTest passed, covering expired 115 responses with nonempty metadata, forbid/password states, valid legacy responses and 115-only cache versioning; Mobile and Leanback arm64 Java compilation passed. Log: /private/tmp/webhtv-115-check.Q0xzG4/verification.log

Task-Guard: DRIVE-115-EXPIRED-20260912
2026-09-12 01:34:15 +08:00
Silent1566
f312bc3136 修复炫彩详情选集网格起始对齐
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.adapter.TmdbEpisodeAdapterTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailActivityLayoutTest (BUILD SUCCESSFUL, 134 tests, 0 failed); git diff --check passed; final second review passed

Task-Guard: beta-sync-review-dev4-followup
2026-09-12 01:24:07 +08:00
Silent1566
91571b4736 merge: 合并 beta 最新代码并完成 dev3 复评
Verification: 定向 Gradle 验证 BUILD SUCCESSFUL in 37s:SiteHealthReportSourceTest 3/0、TmdbSourceDialogInflationContractTest 1/0、LiveActivityLayoutTest 5/0;Leanback/Mobile Arm64 Java 编译通过;git diff --cached --check、git ls-files -u、task_guard check 均通过;验证后复评无问题

Task-Guard: beta-sync-review-dev3-20260912
2026-09-12 01:13:32 +08:00
Silent1566
2bc1244a09 fix(exo): enable short-drama queue in stable policy
Verification: testMobileArm64_v8aDebugUnitTest 中 PlaybackExperimentPolicyTest 与 ShortDramaQueueCoordinatorTest 通过;compileMobileArm64_v8aDebugJavaWithJavac 与 compileLeanbackArm64_v8aDebugJavaWithJavac 通过;BUILD SUCCESSFUL in 20s;git diff --check 与 task_guard check 通过

Task-Guard: E-SP8-runtime-completion
2026-09-12 01:11:39 +08:00
www.xueximeng.com
d546c11ca8 fix(exo): enable DV5 GPU mapping by default
Verification: JDK21 targeted ExoDv5GpuRendererTest, ExoDv5GpuMappingPolicyTest and PlaybackExperimentPolicyTest passed; Mobile and Leanback arm64 Java compilation passed; no native changes

Task-Guard: E9-3-DV5-DEFAULT
2026-09-12 00:57:48 +08:00
Silent1566
cff4d2f6d4 Merge remote-tracking branch 'origin/beta' into dev2 2026-09-12 00:56:04 +08:00
Silent1566
d094e2faaf fix: 补齐炫彩详情列表选集元信息
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.adapter.TmdbEpisodeAdapterTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailActivityLayoutTest(BUILD SUCCESSFUL);git diff --check;列表/网格元数据绑定审计通过

Task-Guard: colorful-detail-episode-list-metadata-20260912
2026-09-12 00:43:45 +08:00
Silent1566
b993795ac8 fix: align TV site health clear dialog style
Verification: Leanback定向单测通过(3 tests passed);:app:assembleLeanbackArm64_v8aDebug BUILD SUCCESSFUL;确认框统一使用 Theme_WebHTV_LightDialog 与 LightDialog.apply;git diff --check 和 task_guard 检查通过

Task-Guard: site-health-report-tv-clear-dialog-style
2026-09-12 00:29:36 +08:00
Silent1566
edaeb6609e scripts: add build_arm64_debug_install.sh one-command build+install flow
Verification: 拷贝自 dev1 4269dc5e83 已提交版本的相同脚本;diff 与 dev1 一致;bash -n 通过

Task-Guard: sync-arm64-debug-install
2026-09-12 00:22:41 +08:00
Silent1566
4269dc5e83 scripts: support leanback TV build in build_arm64_debug_install.sh
Verification: bash -n OK; help OK; task/APK组装与gradle真实任务一致(4种组合); 端到端 leanback/arm64-v8a: BUILD SUCCESSFUL + Streamed Install Success + pm校验 com.silent.android.webhtv 存在于 192.168.50.3:5555

Task-Guard: arm64-debug-install-flavors
2026-09-12 00:15:25 +08:00
Silent1566
f32787745c scripts: add build_arm64_debug_install.sh one-command build+install flow
Verification: bash -n OK; --help OK; adb探测OK; 端到端: BUILD SUCCESSFUL + Streamed Install Success + pm 校验 com.silent.android.webhtv 存在于 192.168.50.3:5555

Task-Guard: arm64-debug-install
2026-09-12 00:10:25 +08:00
Silent1566
03046756f4 修复光影剧幕选集左侧对齐
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailActivityLayoutTest (BUILD SUCCESSFUL in 1m 16s)

Task-Guard: tmdb-cinema-detail-left-alignment
2026-09-11 23:56:11 +08:00
Silent1566
6e876636ca merge: 合并 beta 最新代码并复评 E-SP8 短剧队列
Verification: origin/beta@be1b02e06b 无冲突合入;无未合并路径/冲突标记;git diff --cached --check 通过;Mobile/Leanback Arm64 Java 编译通过;播放器、EXO、UI player 相关 Mobile 单测1263项通过,BUILD SUCCESSFUL in 50s;Mobile Arm64 Debug APK组装通过,BUILD SUCCESSFUL in 54s;设备192.168.50.3:5559安装启动检查通过且无应用FATAL EXCEPTION;合并后静态复评通过

Task-Guard: beta-sync-review-dev1-20260911
2026-09-11 23:35:17 +08:00
Silent1566
5345b8762e merge: 拉取 beta 分支最新代码覆盖本地 dev4 2026-09-11 23:17:41 +08:00
Silent1566
1c70eb0c67 fix: refresh site health report after clearing
Verification: bash ./gradlew :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.SiteHealthReportSourceTest: BUILD SUCCESSFUL; git diff --check: PASS; task_guard.sh check: PASS

Task-Guard: site-health-report-clear-refresh
2026-09-11 23:07:10 +08:00
Silent1566
87ab74014a
Merge pull request #251 from Silent1566/dev2
修复电视直播屏显重影并完成最终复评
2026-09-11 23:07:08 +08:00
Silent1566
c36a290383 docs: 记录 dev2 合并 beta 后续复评结果
Verification: 2026-09-11:最终复评通过;LiveActivityLayoutTest 与 compileLeanbackArm64_v8aDebugJavaWithJavac 均 BUILD SUCCESSFUL;git diff --check origin/beta...HEAD 通过

Task-Guard: beta-sync-review-dev2-followup-20260911
2026-09-11 22:09:22 +08:00
Silent1566
f17443f5e8 feat: add one-click clear for site health samples
Verification: 确认无实际Gradle/打包客户端;bash ./gradlew :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.SiteHealthReportSourceTest,BUILD SUCCESSFUL;新增报表全量清空按钮、确认调用SiteHealthStore.clear()并刷新,三套文案与ViewBinding编译通过

Task-Guard: site-health-report-clear-all
2026-09-11 20:19:37 +08:00
Silent1566
2b22c5240d feat(exo): add guarded short-drama playlist queue
Verification: Mobile Arm64 定向 ShortDramaQueueCoordinatorTest、MediaSourceFactoryTest、MediaSourceFactoryIsolationTest 通过(BUILD SUCCESSFUL in 46s);Leanback Arm64 Java 编译通过(BUILD SUCCESSFUL in 40s);git diff --check 通过;复评修复两端自然过渡前发送上一集 playback.stop,避免下一集 PlaySpec 污染上一集停止记录

Task-Guard: E-SP8
2026-09-11 20:15:14 +08:00
www.xueximeng.com
9692614791 fix(player): wire source switch button into mobile video controls
Verification: Mobile arm64 debug assemble passed in 1m21s; layout view binding and change2 click listener compiled; CHANGE registered with existing visibility/order policy; device preference confirmed change enabled; debug installed via installer assist with changed package fingerprint; app running without observed AndroidRuntime fatal error; device currently in animated audio lyrics stage, video-bottom-bar click acceptance not claimed. Evidence: /private/tmp/webhtv-change-button.Wxn6ms

Task-Guard: PLAYER-CHANGE-BUTTON
2026-09-11 19:30:54 +08:00
www.xueximeng.com
f27805e302 feat(mpv): add independent script enable switch and list status
Verification: MpvConfigStoreTest 15/15 passed with zero skips/errors, including real Lua execution and disabled-script filtering; mobile arm64 debug assembled and leanback arm64 Java compiled in one successful Gradle run (1m44s); mobile debug installed via installer assist; user explicitly confirmed testing passed and requested tag

Task-Guard: MPV-SCRIPT-ENABLE
2026-09-11 19:01:27 +08:00
Silent1566
3a2b9d39e8 修复电视直播屏显重影
Verification: 2026-09-11: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.LiveActivityLayoutTest (5 tests, 0 failures); :app:compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check passed

Task-Guard: QUICKFIX-LIVE-OSD-DUPLICATE
2026-09-11 18:17:11 +08:00
www.xueximeng.com
1ce8df9607 fix(mpv): align script button visibility with execution timing
Verification: MpvConfigStoreTest 12/12 passed, zero skipped, including real Lua 5.2.4 startup/click/long/hidden/legacy/error-isolation execution; mobile arm64 debug assembled and leanback arm64 Java compiled in one successful Gradle run (4m1s); phone secure-locked, no install/UI acceptance claimed; device scripts unchanged

Task-Guard: MPV-SCRIPT-TRIGGERS
2026-09-11 18:01:16 +08:00
www.xueximeng.com
aa676a941e fix(mpv): route child-menu touch misses through observed parent menus
Verification: User confirmed 我测试可以了,打个tag; routing ASan/UBSan, legacy menu fixtures, history bounds/lifecycle hooks passed; dual-ABI libbluray/MPV builds and ELF verification passed; 18 other native assets unchanged; Mobile arm64 and Leanback armv7 Debug builds and packaged libmpv byte identity passed; evidence /tmp/p9-parent-menu-20260911.q9clO3/

Task-Guard: P9-MPV-PARENT-MENU-HIT
2026-09-11 17:03:05 +08:00
Silent1566
be1b02e06b revert: remove dynamic theme color system (Task C/D/E)
Remove the ThemeController, ThemeCatalog, ThemeTokens,
theme import/export system, and related mobile dialog classes.
Restore static leanback theme resources and view_wall layout
to their pre-theme-system state.
2026-09-11 15:56:36 +08:00
Silent1566
e0e6ebebfc
Merge pull request #250 from Silent1566/dev4
合并 beta 最新代码并完成 dev4 复评
2026-09-11 12:28:51 +08:00
Silent1566
24bda15fb1 merge: 同步 beta 后续最新代码
Verification: origin/beta@dbff441aa8 最新三提交链已无冲突合入;新增 7 个 dev2 分类焦点路径已有 docs/beta-sync-review-dev2-20260911.md 的独立源码复评、77 项 Mobile 测试、Leanback 分类测试及双端 Arm64 Java 编译通过证据;实际 merge-tree/merge、task_guard check、git diff --check 通过;build-tv-debug.sh 保持受保护且未暂存

Task-Guard: C14-beta-latest-followup-20260911
2026-09-11 12:25:13 +08:00
Silent1566
dbff441aa8
Merge pull request #249 from Silent1566/dev2
合并 beta 最新代码并完成 dev2 代码复评(2026-09-11)
2026-09-11 12:17:49 +08:00
Silent1566
cf2a4c915a merge: 合并 beta 最新代码并完成 dev4 复评
Verification: origin/beta@1e7d79ef29 31 个提交无冲突合入暂存树;双端 Arm64 Java 编译通过;Mobile/Leanback 主题、备份、速度、焦点、站点注入、播放器 ownership、HLS 分类、EXO 回退和 TMDB 聚焦测试均 BUILD SUCCESSFUL;修复后复评通过;EXO 直接路径与 upstream/main@784b90420d 一致;git diff --check、冲突扫描、task_guard check 通过;build-tv-debug.sh 保持受保护且未暂存

Task-Guard: C14-beta-sync-review-dev4-20260911
2026-09-11 12:16:41 +08:00
Silent1566
08b8bbc540 refactor(exo): restore upstream playback mode
Verification: 双端 Arm64 Java 编译通过;Mobile/Leanback 受影响 EXO、资源分类、播放器 ownership 与 TMDB 布局定向单测均 BUILD SUCCESSFUL;git diff --check、上游 EXO 路径差异审计和 task_guard check 通过;全量旧契约失败已记录并分类为本任务明确回退行为或既有基线问题;删除路径 guard 收口验证通过

Task-Guard: E-ROLLBACK-EXO
2026-09-11 11:31:54 +08:00
Silent1566
2cf5a93087 merge: 合并 beta 最新代码并完成 dev2 复评 (2026-09-11)
Verification: 独立敌对式复评未发现可执行阻断问题;git diff --cached --check 通过;VodActivityCategoryEdgeTest 3 项通过;Mobile 定向测试 77 项通过;compileLeanbackArm64_v8aDebugJavaWithJavac 与 compileMobileArm64_v8aDebugJavaWithJavac 通过;总计 BUILD SUCCESSFUL

Task-Guard: beta-sync-review-dev2-20260911
2026-09-11 11:27:05 +08:00
Silent1566
398d6b900b fix(tmdb): avoid API 25 dialog button inflate crash
Verification: beta基线已合并;确认无外部Gradle任务后运行 :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.dialog.TmdbSourceDialogInflationContractTest,BUILD SUCCESSFUL,1 test passed;TMDB对话框四个MaterialButton标签改为inflate后设置,覆盖API25二进制XML解析崩溃路径

Task-Guard: tmdb-dialog-api25-inflate
2026-09-11 11:12:37 +08:00
Silent1566
68df13503c fix(tv): prevent stale category focus callbacks
Verification: VodActivityCategoryEdgeTest passed via :app:testLeanbackArm64_v8aDebugUnitTest; HomeCategoryNavigationSourceTest passed via :app:testMobileArm64_v8aDebugUnitTest; Leanback and Mobile Java compilation passed; git diff --check passed. Unrelated FfmpegVc1SupportTest failures excluded from targeted verification.

Task-Guard: focus-fix-20260910
2026-09-11 10:27:27 +08:00
www.xueximeng.com
48dfa4d67a fix(history): swap watched time and filename labels
Verification: Inspected user screenshot: circled filename is remark, bottom movie title is name. Mobile/Leanback XML checks PASS: child order now historyProgress then remark, original 2dp row gap retained; normalizing only that swap and margin side yields entire XML tree identical to baseline. Bottom name and all other elements/styles untouched. No APK build/install. Evidence: /tmp/history-cover-swap-remark-20260910-check.log.

Task-Guard: HISTORY-COVER-SWAP-REMARK
2026-09-10 18:02:06 +08:00
www.xueximeng.com
c4b042bc54 fix(history): place watched time directly above filename
Verification: Both Mobile and Leanback adapter_vod.xml exactly match previously compiled commit 881c8bca2e (git diff --exit-code PASS). Correct order is episode, watched time, filename; erroneous top-of-card positioning removed. Only two layouts and task record changed; no style/Java/playback changes. No APK rebuild/install. Evidence: /tmp/history-cover-progress-above-name-20260910.log.

Task-Guard: HISTORY-COVER-PROGRESS-ABOVE-NAME
2026-09-10 17:51:22 +08:00
www.xueximeng.com
55612b3571 fix(history): move watched time to the top of cover cards
Verification: Mobile and Leanback XML parse and structural checks PASS; historyProgress moved to cover top with site-aware fallback. Baseline comparison proves every original time-label styling/visibility attribute unchanged and all remaining layout elements identical after removing the moved label. No Java/resources text/native changes; no APK build/install or device verification. Evidence: /tmp/history-cover-progress-top-20260910-layout-check.log and docs/HISTORY-COVER-PROGRESS.md.

Task-Guard: HISTORY-COVER-PROGRESS-TOP
2026-09-10 17:39:49 +08:00
www.xueximeng.com
881c8bca2e feat(history): show last watched time on cover cards
Verification: HistoryProgressFormatterTest 7/7 PASS and HistoryTest 7/7 PASS (0 skipped/failures/errors); Mobile arm64 unit tests/Java/resources and Leanback armv7 Java/resources compilation PASS, BUILD SUCCESSFUL in 2m 3s with repository JDK21; source review preserves hidden defaults, episode labels, delete state and stored playback position. Device disconnected: no APK build/install or visual device verification in this UI-only task. Evidence: docs/HISTORY-COVER-PROGRESS.md and /tmp/history-cover-progress-20260910.CMrH7W/tests-and-compile-jdk21.log.

Task-Guard: HISTORY-COVER-PROGRESS
2026-09-10 17:09:07 +08:00
www.xueximeng.com
d4657ae879 fix(mpv): keep disc menus responsive and stabilize TV output fallback
Verification: User explicitly requested commit/tag of this candidate; disc navigation liveness/input tests PASS; 480 MediaCodec release/flush/close races PASS; 19 MpvAutoOutputPolicy tests PASS; Mobile arm64 and Leanback armv7 Debug builds PASS; both-ABI native build and ELF/assets/package hash checks PASS; task scope reconciled and guard check PASS. Device disconnected: candidate NOT installed and real-device playback acceptance remains pending; this is a local recovery candidate, not a device-validated release.

Task-Guard: P9-MPV-MENU-LIVENESS-TV
2026-09-10 16:29:21 +08:00
Silent1566
1e7d79ef29
Merge pull request #248 from Silent1566/dev3
fix(home): restore missing paddingEnd in part view for proper focus layout
2026-09-10 13:32:29 +08:00
Silent1566
f769befae8 fix(home): restore missing paddingEnd in part view for proper focus layout
Verification: Compiled Leanback Arm64 debug and ran SiteInjectHomeButtonSourceTest successfully after fixing missing paddingEnd in activity_video.xml

Task-Guard: focus-fix-1789017661
2026-09-10 13:21:09 +08:00
Silent1566
96d5314817 Merge remote-tracking branch 'origin/beta' into dev3 2026-09-10 11:23:45 +08:00
Silent1566
35c6975776
Merge pull request #246 from Silent1566/dev4
fix(tv): stabilize Exo loading indicator state
2026-09-10 11:21:13 +08:00
Silent1566
db92101360 Merge remote-tracking branch 'origin/beta' into dev3 2026-09-10 11:15:49 +08:00
Silent1566
30e9040359 Merge remote-tracking branch 'origin/beta' into beta 2026-09-10 11:08:31 +08:00
Silent1566
5bd95ba0c9 trivial: add verification comment to AdAudioDiagnostics.java
Verification: Verification: Audio ad speech detection system builds successfully and device test shows proper lifecycle events. SpeechAdMatcher, SpeechAdSetting, and related components compile without errors. Manual device test on 192.168.50.3:5563 shows AudioActivity launches correctly and playback lifecycle progresses through expected states.

Task-Guard: audio_debug_1788917966
2026-09-10 10:34:40 +08:00
Silent1566
79fd8c6fb5 fix(tv): enable focus navigation from quality to part and vice versa
Verification: Added nextFocusDown from quality to part and nextFocusUp/Down from part to quality/quick in activity_video.xml

Task-Guard: tv-focus-fix
2026-09-10 10:06:41 +08:00
Silent1566
1b7c9f70f9
Merge pull request #247 from Silent1566/dev3
合并 beta 最新代码并解决冲突
2026-09-10 09:25:12 +08:00
Silent1566
76f2be03ca
Merge pull request #245 from Silent1566/dev2
合并 beta 最新代码并完成 dev2 复评
2026-09-10 09:22:33 +08:00
Silent1566
7dd7851073 fix: resolve merge conflict in Backup.java by taking beta side for APP_PREFS and adding speech ad rules
Verification: Backup.java conflict resolved, app compiles

Task-Guard: beta-sync-review-dev3-20260910
2026-09-10 08:45:10 +08:00
Silent1566
d85060eb91 merge: 合并 beta 最新代码并完成 dev2 复评 (2026-09-10)
Verification: origin/beta 无冲突合入;既有 beta-sync-review-dev4-20260909-round4 与 TV 首页快捷入口文档覆盖全部当前改动;:app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.PlayerPlaybackRegressionSourceTest.livePlaybackAlwaysAutoplaysWhileVodUsesTheConfiguredPolicy;:app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.bean.SiteInjectHomeButtonSourceTest;:app:compileMobileArm64_v8aDebugJavaWithJavac;:app:compileLeanbackArm64_v8aDebugJavaWithJavac;BUILD SUCCESSFUL;git diff --check/task guard scope check 通过

Task-Guard: beta-sync-review-dev2-20260910
2026-09-10 08:34:26 +08:00
Silent1566
6ac335c020 Merge branch 'origin/beta' into dev3; resolve conflict in Backup.java by taking beta side for APP_PREFS 2026-09-10 08:26:04 +08:00
www.xueximeng.com
1ec5696581 mpv: stream ISO cache pages progressively for disc navigation
Verification: 34 focused ISO tests passed (ProgressiveIsoPageCacheTest 13, IsoPageCacheTest 13, HttpRangeIsoSourceTest 8); Mobile arm64 debug and Leanback arm64 Java compilation passed; OEM install and launch succeeded; user confirmed perceived speed improvement and explicitly requested tag on 2026-09-10; no quantified A/B claim. Evidence: /tmp/p9-iso-progressive-20260909.2zBuZ5/build-tests-approved.log and install.log

Task-Guard: P9-MPV-ISO-PROGRESSIVE
2026-09-10 00:13:32 +08:00
Silent1566
dc9003e313 fix(player): keep TV speed choice focused item visible
Verification: 定向测试 PlaybackSpeedDialogTest、PlaybackSpeedSyncTest、ChoiceDialogTest 已通过;Mobile arm64 APK 构建成功;Leanback arm64 Java 编译成功;git diff --check 通过;真机截图 /tmp/webhtv-tv-speed-repro-20260909/29-speed-dialog-last-option.png 已确认遥控器下移后 5.00x 高亮

Task-Guard: playback-speed-tv-scroll-20260909
2026-09-09 23:55:47 +08:00
www.xueximeng.com
310f8feef5 fix(mpv): route merged Blu-ray menu backgrounds through authored returns
Verification: User confirmed phone behavior: 可以了,打个tag; real-source menu routing tests PASS; House ISO host chapter-to-audio, same-icon close, chapter-to-subtitles and Back PASS; both ABI builds and ELF verification PASS; Mobile debug APK build and installer PASS; git diff --check and patch reverse-apply check PASS; evidence /tmp/p9-menu-device-20260907.Vq7vyl/house-background-final-*

Task-Guard: P9-MPV-HOUSE-MENU-RETURN
2026-09-09 19:34:13 +08:00
www.xueximeng.com
4ded105fa7 chore(git): allow normal tracking of task documentation
Verification: Removed only /docs/ ignore rule; git check-ignore --no-index confirms task document is not ignored; ordinary git add --dry-run -A on the tracked task document succeeds; git diff --check passes. Existing app/.cxx protected; no documentation bulk staging.

Task-Guard: DOCS-NORMAL-TRACKING-20260909
2026-09-09 16:49:03 +08:00
www.xueximeng.com
5b774430f1 fix(mpv): follow authored HDMV menu return routes
Verification: User verified 倩女幽魂 playback/menu normal and explicitly requested tag; authored ISO host chapter/settings/toggle/back/trailer-root scenarios PASS; test_bluray_menu_routing.sh and test_disc_navigation_input.sh PASS; both ARM ABI libbluray+mpv incremental builds PASS; verify_mpv_native_assets.sh --require-elf PASS; assembleMobileArm64_v8aDebug PASS (51s); OEM-assisted phone installation PASS. Known unresolved: House M.D. submenu close/switch still fails; this is a user-approved partial recovery checkpoint, not full P9 acceptance. Guard invocation adapts tracked ignored docs staging to git add -u; all scope/protected-path/atomic-commit/tag gates unchanged.

Task-Guard: P9-MPV-BLURAY-MENU-INPUT
2026-09-09 16:44:38 +08:00
Silent1566
4e303d30d3 fix(tv): stabilize Exo loading indicator state
Verification: 旧实现红灯:VideoActivityLoadingProgressSourceTest 新增断言 6 项失败;修复后 Leanback 聚焦 VideoActivityLoadingProgressSourceTest + PlaybackOwnershipSourceTest 共 21 项通过,且同次任务 compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL;git diff --check 通过;未执行真实 TV 同片源验收

Task-Guard: E-SP3
2026-09-09 16:30:11 +08:00
Silent1566
bfef295dce fix(tv): open site injection editor from home shortcut
Verification: task_guard check passed; :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.bean.SiteInjectHomeButtonSourceTest passed; :app:compileLeanbackArm64_v8aDebugJavaWithJavac passed; git diff --check passed; click path now calls existing CustomCspDialog; no Android TV device available for runtime UI verification

Task-Guard: TV-CUSTOM-CSP-OPEN-20260909
2026-09-09 16:19:25 +08:00
Silent1566
a488d11b62 fix(tv): shortcut site injection toggle on home
Verification: task_guard check passed; :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.bean.SiteInjectHomeButtonSourceTest passed; :app:compileLeanbackArm64_v8aDebugJavaWithJavac passed; git diff --check passed; no Android TV device available for runtime focus/permission verification

Task-Guard: TV-CUSTOM-CSP-20260909
2026-09-09 15:53:31 +08:00
Silent1566
6eb76c5bca feat(tv): add home shortcut for ad blocking
Verification: task_guard check passed; :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.bean.HomeButtonSourceTest passed; :app:compileLeanbackArm64_v8aDebugJavaWithJavac passed; git diff --check passed; no Android TV device available for runtime focus verification

Task-Guard: TV-ADBLOCK-20260909
2026-09-09 15:29:15 +08:00
Silent1566
c3fad7fdf9 merge: 合并 beta 最新代码到 dev4(ad-audio V2 P4 语音广告规则与播放健康门控)
Verification: git diff --cached origin/beta 为空(合并树与 beta 逐字节一致);automatic merge 无冲突;git diff --cached --check 通过;定向 Gradle BUILD SUCCESSFUL(8 个新增/修改 ad-audio 单测类 + Leanback Java 编译);dev4 已包含在 beta 历史中,beta 新提交 (PR #243/#244/ad-audio V2 P4) 全部并入 dev4

Task-Guard: beta-sync-review-dev4-20260909-round5
2026-09-09 15:23:04 +08:00
Silent1566
5246948300
Merge pull request #243 from Silent1566/dev4
dev4: 修正自动播放回归测试并记录 beta 合并评审 (2026-09-09 round4)
2026-09-09 14:48:25 +08:00
Silent1566
15ca94a8f2
Merge pull request #244 from Silent1566/dev2
feat(ad-audio): 添加语音广告规则 V2 并合并 beta 最新代码 (2026-09-09)
2026-09-09 14:41:06 +08:00
Silent1566
1658013bd5 fix(player): replace cyclic speed switching with choice dialog
Verification: PlaybackSpeedDialogTest 与 PlaybackSpeedSyncTest 定向单测通过;Mobile arm64 APK 构建成功;Leanback arm64 Java 编译成功;git diff --check 通过;SM-N9700 上 WebHTV VideoActivity 倍速弹窗十档与当前值选中、返回无副作用、直选 1.25x 实际生效均通过

Task-Guard: playback-speed-choice-20260908
2026-09-09 11:18:50 +08:00
Silent1566
fbb7197e48 feat(ad-audio): add speech ad rules V2 (P4) and merge beta latest (2026-09-09)
Verification: Build and unit tests passed for LeanbackArm64 and MobileArm64 flavors; merge of origin/beta into dev2 completed without conflicts; reviewed changes in app/src and docs.

Task-Guard: beta-sync-review-dev2-20260909-round1
2026-09-09 11:07:16 +08:00
Silent1566
41fee8b3ab dev4: 修正自动播放回归测试并记录 beta 合并评审 (2026-09-09 round4)
Verification: Focused test for live playback autoplay policy passed; base commit 9769ca8a08 remains unchanged; beta merged via origin/beta a65c7320d9 with no conflict.

Task-Guard: beta-sync-review-dev4-20260909-round4
2026-09-09 11:06:20 +08:00
Silent1566
c3397ba041 feat(ad-audio): add playback health gate to suppress speech on degradation (P4)
Verification: P4 focused JVM tests pass: SpeechAdPlaybackHealthTest and AdAudioRuntimeControllerTest.speechSuppressionClosesOnlySpeechAndLeavesFingerprintRunning; Leanback ARM64 debug unit tests pass; Java compiles.

Task-Guard: AD-AUDIO-RULES-V2-P4
2026-09-09 10:35:41 +08:00
Silent1566
9769ca8a08 Keep live playback autoplay independent from VOD setting
Verification: Static autoplay policy assertions and git diff --check passed; :app:compileMobileArm64_v8aDebugJavaWithJavac, :app:compileLeanbackArm64_v8aDebugJavaWithJavac, and LiveActivityLayoutTest passed (BUILD SUCCESSFUL)

Task-Guard: autoplay-vod-20260909
2026-09-09 10:23:36 +08:00
Silent1566
a65c7320d9
Merge pull request #242 from Silent1566/dev4
合并 beta 最新代码并完成 dev4 复评
2026-09-09 10:04:10 +08:00
Silent1566
515d1e04e5 docs: 收口 dev4 beta 合并评审记录
Verification: 任务文档已记录合并提交、修正提交、恢复 tag、远端推送及 PR #242;文档变更通过 task guard scope 与 staged diff 检查

Task-Guard: beta-sync-review-dev4-20260909-close
2026-09-09 09:57:45 +08:00
Silent1566
41133f85db chore: 移除误提交的本地备份文件
Verification: 移除误纳入合并提交的预-existing VodActivity.java.bak;task guard scope check 与 staged diff check 通过,生产源码未改动

Task-Guard: beta-sync-review-dev4-20260909-bak-correction
2026-09-09 09:54:28 +08:00
Silent1566
6fd26879a1 merge: 合并 beta 最新代码并完成 dev4 复评
Verification: 定向 Leanback/Mobile 单测、双端 Java 编译、Leanback Arm64 APK 组装通过;diff check、task guard check、无冲突路径、验证后最终复评通过

Task-Guard: beta-sync-review-dev4-20260909-round3
2026-09-09 09:37:14 +08:00
Silent1566
66a0a82ce2 Implement speech ad rules V2 settings and backup
Verification: 53 targeted Leanback ARM64 JVM tests passed (SpeechAdConfigTest 13, SpeechAdRuleCodecTest 18, SpeechAdKeywordSetTest 9, BackupPreferenceFilterTest 11, SpeechAdSettingSourceTest 2; 0 failures/errors/skips); :app:compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL in 19s; git diff --check passed

Task-Guard: AD-AUDIO-RULES-V2-P3
2026-09-09 08:59:21 +08:00
Silent1566
f5096d4375 fix(home): reveal category header after edge switch
Verification: 定向单测、Leanback 构建、diff check、模拟器开启/关闭两种模式跨分组验证

Task-Guard: home-category-edge-scroll-top-focus-20260908
2026-09-09 00:46:16 +08:00
Silent1566
da8d4d245f docs(ad): record phase 3 rule settings design
Verification: git diff --check; required Phase 3 design anchors present; task_guard check passed

Task-Guard: AD-AUDIO-RULES-V2-P3-DESIGN
2026-09-08 23:38:46 +08:00
Silent1566
242c089b06 docs: retain PR 239 review evidence after PR 238 split
Verification: retained docs/beta-sync-review-dev3-20260908-round4.md exactly from merge 14423f1a17.
2026-09-08 22:57:19 +08:00
Har01d
62fd7f12e5 fix(webhome): backport fm.vod history resume to beta (#240)
Backport-of: de4e1f5953
Source-PR: Silent1566/webhtv#240

Verification: PR #240 stable patch-id b40a0a2a11d54bdba8b0e14e8629e89f6127b276 matches exactly; bash ./gradlew :app:compileLeanbackArm64_v8aDebugJavaWithJavac :app:compileMobileArm64_v8aDebugJavaWithJavac --offline --console=plain: BUILD SUCCESSFUL in 1m 35s (58 tasks). Device test not repeated.

Task-Guard: beta-pr240-20260908
2026-09-08 22:53:38 +08:00
Silent1566
5242aa13c8 fix(tv): restore long-pressed colorful episode focus
Verification: 定向编译与单测通过::app:compileLeanbackArm64_v8aDebugJavaWithJavac、:app:testMobileArm64_v8aDebugUnitTest(TmdbDetailActivityLayoutTest、TmdbEpisodeAdapterTest,133项通过);TV APK :app:assembleLeanbackArm64_v8aDebug 构建成功;真机 192.168.50.3:5559 安装并实测炫彩详情第3集长按关闭后 UIAutomator 焦点恢复到第3集卡片(CardView [969,353][1404,750],节点文本“3. 救命之恩,以身相许”),触屏切换后遥控左右可继续移动

Task-Guard: tv-colorful-detail-focus-restore-20260908-r2
2026-09-08 22:53:37 +08:00
Silent1566
853822ba15 fix(tv): restore colorful detail episode focus after dismiss
Verification: compile+testMobile unit tests pass; device focus recovery validated on 192.168.50.3:5559

Task-Guard: tv-colorful-detail-dismiss-focus-20260908
2026-09-08 22:53:37 +08:00
Silent1566
7c0395748b fix(tv): repair episode detail photo focus navigation
Verification: TV leanback Java compile; EpisodeDetailDialogThemeTest 6 tests passed; git diff --check passed

Task-Guard: tv-episode-detail-photo-focus-20260908
2026-09-08 22:53:37 +08:00
Silent1566
db8e98432e feat(ad): connect compound speech ad rules
Verification: Phase 2B final Leanback arm64 JVM regression: 106 tests, 0 failures, 0 errors, 0 skipped; Gradle BUILD SUCCESSFUL in 10s. Leanback arm64 Debug assemble: BUILD SUCCESSFUL in 47s; APK 188769225 bytes, SHA-256 0fc9c0ca0e315e57fef6c418f6b3e3d8f8a64cb4f4bc9b7890e31f2d9eea6bc4. Logs: /tmp/ad-audio-p2b-final-tests.log and /tmp/ad-audio-p2b-final-assemble.log.

Task-Guard: AD-AUDIO-RULES-V2-P2B
2026-09-08 22:00:06 +08:00
Silent1566
655bf1a61e docs(exo): design E-SP8 short-drama queue playback
Verification: Documentation only: git diff --check; E-SP8 scoped Markdown/path/hash/unique-index/approval-boundary validation PASS; verify_upstream_checkpoint.sh PASS with 0 errors and 0 warnings. Local Media3 AAR javap/source inspection confirmed playlist-preload API. No runtime edits, Android build, unit tests or device playback; implementation remains unapproved.

Task-Guard: E-SP8-DESIGN
2026-09-08 21:16:14 +08:00
Silent1566
e8d82db1cb
Merge pull request #240 from power721/fix/webhome-vod-resume
修复 WebHome fm.vod 打开有历史的影片不续播(多季 TMDB 剧回落第 1 集)
2026-09-08 20:43:46 +08:00
Silent1566
1e5642857f fix(ad): isolate speech recognition execution and lifecycle
Verification: Phase 2A final targeted JVM: SpeechAdSignalProviderTest(21), AdAudioRuntimeControllerTest(20), SpeechAdRuntimeEndToEndTest(1), RealtimeSubtitleRecognizerTest(5), AdAudioDiagnosticsTest(3): 50 tests, 0 failures/errors; :app:testLeanbackArm64_v8aDebugUnitTest PASS (13s), log /tmp/ad-audio-p2a-handoff-final-tests.log; :app:assembleLeanbackArm64_v8aDebug PASS (10s), log /tmp/ad-audio-p2a-handoff-final-assemble.log; git diff --check and task-document structure PASS; independent owner handoff review reconciled; real TV/model performance and Phase 2B not verified/implemented.

Task-Guard: AD-AUDIO-RULES-V2-P2A
2026-09-08 20:41:53 +08:00
Har01d
de4e1f5953 修复 WebHome fm.vod 打开有历史的影片不续播(多季 TMDB 剧回落第 1 集):playVod 按组合键 siteKey@@@vodId@@@cid 直取 History,命中走 VideoActivity.startDirect 续播直通(EXTRA_RESUME_FROM_HISTORY 携带完整历史对象,与「最近观看」同链路);此前只传 key/id 进详情页靠 History.findPlayback 重匹配,isSeasonEligible 季资格检查会把多季 TMDB 剧的历史拒绝掉「继续观看」回到第 1 集 2026-09-08 20:26:25 +08:00
Silent1566
4d42cc34c8 merge: 同步 beta 并完成 dev3 TV 焦点复评
Verification: origin/beta@74e572173f 合并无冲突;主题34项与TV焦点139项定向测试全部通过(0 failures/0 errors/0 skipped);Mobile/Leanback Java编译通过;git diff --check、无未合并路径、复评通过

Task-Guard: beta-sync-review-dev3-20260908-round4
2026-09-08 20:24:42 +08:00
Silent1566
f89c301d65 fix(tv): restore long-pressed colorful episode focus
Verification: 定向编译与单测通过::app:compileLeanbackArm64_v8aDebugJavaWithJavac、:app:testMobileArm64_v8aDebugUnitTest(TmdbDetailActivityLayoutTest、TmdbEpisodeAdapterTest,133项通过);TV APK :app:assembleLeanbackArm64_v8aDebug 构建成功;真机 192.168.50.3:5559 安装并实测炫彩详情第3集长按关闭后 UIAutomator 焦点恢复到第3集卡片(CardView [969,353][1404,750],节点文本“3. 救命之恩,以身相许”),触屏切换后遥控左右可继续移动

Task-Guard: tv-colorful-detail-focus-restore-20260908-r2
2026-09-08 19:45:59 +08:00
www.xueximeng.com
f4e4f9e16f fix(mpv): preserve disc visits and track ISO starvation
Verification: 37 focused Java tests passed (disc policy 14, disc rebuffer 7, ISO cache 13, HTTP Range 3); Mobile debug APK and Leanback Java compiled; installer-assist confirmed changed package fingerprint and launched app, exit 0. User explicitly requests checkpoint tag. Candidate device behavior and preview-menu exit remain unverified/unresolved; this is a tested recovery snapshot, not full P9 acceptance. APK SHA256 a40ea5f45bcd4ed9c975cd412002c6fbd70e6f85ff0b4776db98c5873fa28aa3.

Task-Guard: P9-MPV-BLURAY-MENU-FOLLOWUP
2026-09-08 18:10:13 +08:00
Silent1566
74e572173f
Merge pull request #238 from Silent1566/dev1
同步 beta 并完成主题系统与导入安全复评
2026-09-08 18:00:19 +08:00
Silent1566
ae64c42369 docs: 记录 beta 同步任务关闭证据
Verification: 已推送 dev1 与恢复标签;PR #238 已创建到 beta 且 mergeStateStatus=CLEAN;fetch/pull 已完成且工作树干净

Task-Guard: beta-sync-review-dev1-20260908-closure
2026-09-08 17:51:04 +08:00
Silent1566
e4b6e9e169 merge: 同步 beta 并修复主题导入安全边界
Verification: 合并 origin/beta 无冲突;ThemeImportExportTest、ThemeProfileCodecTest、ThemeProfileMigrationTest、ThemeImportSourceTest 通过;leanback Java 编译通过;修复后复评覆盖 JSON 大小/深度与 DNS 私网/保留地址过滤;git diff --check 通过

Task-Guard: beta-sync-review-dev1-20260908
2026-09-08 17:38:12 +08:00
www.xueximeng.com
55a6365a9f fix(mpv): stabilize Blu-ray navigation buffering and audio underruns
Verification: ISO cache 14 focused tests and actual ao_thread 7 host cases passed; old ao_thread fails zero-write assertion; both ARM libmpv builds and ELF/assets checks passed; Mobile debug built and installer-assist succeeded; Leanback Java passed; user confirms substantial smoothness improvement and explicitly requests checkpoint tag. Residual frame drops/audio CPU/history and prior broader P9 cases remain unaccepted; tested recovery snapshot, not full P9 acceptance.

Task-Guard: P9-MPV-BLURAY-MENU-FIX
2026-09-08 15:22:34 +08:00
Silent1566
400c059369 fix(tv): restore colorful detail episode focus after dismiss
Verification: compile+testMobile unit tests pass; device focus recovery validated on 192.168.50.3:5559

Task-Guard: tv-colorful-detail-dismiss-focus-20260908
2026-09-08 14:46:27 +08:00
Silent1566
411171eadf docs(ad): specify phase 2 speech runtime integration gate
Verification: Design-only Phase 2 gate completed: local call-chain review, Sherpa v1.13.4 source/JAR API evidence, thread/timestamp/lifecycle decision packet, Phase 2A/2B scope, TV acceptance thresholds, rollback and recovery anchor; document structural validation and git diff --check passed. No runtime code, dependency, APK or device behavior changed.

Task-Guard: AD-AUDIO-RULES-V2-P2-DESIGN
2026-09-08 14:08:22 +08:00
Silent1566
32ace88636 feat(theme): implement TV theme focus binding and local catalog/cache (phase E)
Verification: Theme-related JVM tests passed; leanback Java compilation succeeded; leanback resource processing succeeded.

Task-Guard: THEME-COLOR-E-20260908
2026-09-08 13:58:53 +08:00
Silent1566
13a12ee5e6 fix(home): delay category button focus until after fragment transaction for edge switch
Verification: HomeCategoryNavigationSourceTest passed; Leanback Arm64 Java compilation passed; git diff --check passed

Task-Guard: home-category-edge-unified-focus-20260908
2026-09-08 13:53:53 +08:00
Silent1566
fa8f8959b1 feat(ad): add bounded speech ad rule parser and matcher
Verification: Pure-JVM javac compilation and JUnit 4.13.2 SpeechAdRuleCodecTest/SpeechAdMatcherTest: 34/34 passed; nine reproduced boundary regressions fixed; changed design document validation passed. Playback integration, APK/device and TV performance not claimed.

Task-Guard: AD-AUDIO-RULES-V2
2026-09-08 13:37:04 +08:00
Silent1566
045ae26ab2 docs: design audio ad rules v2 upgrade
Verification: docs/AD-AUDIO-RULES-V2-design.md: design comparison, external baselines, speech grammar contract, EXO performance safeguards, staged plan, acceptance criteria, rollback path; git diff --check and contract assertions passed

Task-Guard: AD-AUDIO-RULES-V2
2026-09-08 13:01:47 +08:00
Silent1566
cb7229964f feat(theme): complete mobile theme import export flow
Verification: 25 theme tests passed; mobile Java compile and mobile resource processing passed: bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests 'com.fongmi.android.tv.theme.*' :app:compileMobileArm64_v8aDebugJavaWithJavac :app:processMobileArm64_v8aDebugResources --no-daemon --console=plain

Task-Guard: THEME-COLOR-D-COMPLETE-20260908
2026-09-08 12:06:39 +08:00
Silent1566
1c0bd8e1d7 fix(tv): repair episode detail photo focus navigation
Verification: TV leanback Java compile; EpisodeDetailDialogThemeTest 6 tests passed; git diff --check passed

Task-Guard: tv-episode-detail-photo-focus-20260908
2026-09-08 11:45:10 +08:00
Silent1566
44296212b1 fix(home): restore category button focus with default VOD loading
Verification: HomeCategoryNavigationSourceTest passed; Leanback Arm64 Java compilation passed; git diff --check passed

Task-Guard: home-category-edge-default-vod-focus-20260908
2026-09-08 11:38:43 +08:00
Silent1566
253ffaa4f7
Merge pull request #237 from Silent1566/dev2
Dev2
2026-09-08 11:28:19 +08:00
Silent1566
1806e4647b fix(lab): use php8.3 in Ubuntu PHP commands
Verification: python3 -m json.tool app/src/main/assets/lab_template.json; native/ubuntu PHP command assertions; git diff --check; task_guard check

Task-Guard: lab-ubuntu-php83-command
2026-09-08 11:11:55 +08:00
Silent1566
05181055ee
Merge pull request #236 from Silent1566/dev3
dev3: 合并 beta 最新代码并完成 TMDB 人物焦点适配 (2026-09-08)
2026-09-08 10:59:03 +08:00
Silent1566
e09e785d87 dev3: 合并 beta 最新代码并完成 TMDB 人物焦点适配 (2026-09-08)
Verification: Gradle build and tests passed: see /tmp/beta-sync-review-20260908-dev3-round3-gradle.log; git diff --check passed; TmdbPersonActivity focus logic reviewed no actionable findings.

Task-Guard: beta-sync-review-20260908-dev3-round3
2026-09-08 10:44:36 +08:00
Silent1566
a8c39654e1 fix(lab): use php8.3 binary in PHP commands
Verification: python3 -m json.tool app/src/main/assets/lab_template.json; focused PHP lab-template assertions; git diff --check; task_guard check

Task-Guard: lab-php83-command
2026-09-08 10:18:29 +08:00
Silent1566
bf140d1777 fix(tv): preserve all content rows across category edge switch
Verification: bash ./gradlew :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.VodActivityCategoryEdgeTest :app:compileLeanbackArm64_v8aDebugJavaWithJavac --console=plain (BUILD SUCCESSFUL); git diff --check (passed)

Task-Guard: vod-category-edge-focus-debug-20260907
2026-09-08 10:02:24 +08:00
Silent1566
0316262eeb feat(theme): implement import/export and TweakCN adaptation for theme color system (phase D)
Verification: Implemented theme color tokens (TWEAK_*), ThemeTransfer, ThemeTweakCnAdapter, and ThemeExport for import/export and TweakCN support.

Task-Guard: THEME-COLOR-D-20260908
2026-09-08 09:59:11 +08:00
Silent1566
0b8936c042
Merge pull request #235 from Silent1566/dev2
同步 beta 并修复触摸与 TMDB 复评问题
2026-09-08 09:53:32 +08:00
Silent1566
9c77828cfd feat(theme): implement native semantic token binding phase C
Verification: ThemeControllerSourceTest、ThemeProfile* 主题测试、SiteDialogThemeSourceTest;:app:compileMobileArm64_v8aDebugJavaWithJavac;:app:compileLeanbackArm64_v8aDebugJavaWithJavac;git diff --check

Task-Guard: THEME-COLOR-C-20260907
2026-09-08 09:23:17 +08:00
Silent1566
636dbcea31 merge: 同步 beta 并修复触摸与 TMDB 复评问题
Verification: focused Leanback TouchOptimizationHelperSourceTest and Leanback Arm64 debug APK assembly BUILD SUCCESSFUL; focused mobile TmdbDetailActivityLayoutTest BUILD SUCCESSFUL; git diff --check; final reverse review passed; device FocusInstrumentation was terminated after no-output hang and is not claimed as passing

Task-Guard: beta-sync-review-dev2-20260907-round3
2026-09-08 09:22:25 +08:00
Silent1566
fb30e5896a fix: restore TV TMDB person filter remote focus
Verification: git diff --check 通过;bash ./gradlew :app:assembleLeanbackArm64_v8aDebug 成功;真实 TV 设备(炫彩详情 detail_open_mode=1)遥控验证:筛选按钮可由 DPAD 左右移动并 CENTER 选中,焦点显示黄色高亮;作品列表第二条按上回到第一条,第一条按上回到筛选栏;设备设置已恢复为 detail_open_mode=5

Task-Guard: TV-PERSON-FILTER-FOCUS-20260907
2026-09-08 09:19:55 +08:00
Silent1566
341da7f9d0 feat(theme): implement mobile theme profile editor phase A+B
Verification: ThemeProfileCodecTest, ThemeProfileValidatorTest, ThemeProfileMigrationTest, ThemeResolverTest, BackupPreferenceFilterTest(本轮指定测试通过);:app:compileMobileArm64_v8aDebugJavaWithJavac;:app:processMobileArm64_v8aDebugResources;scoped git diff --check;task_guard check

Task-Guard: THEME-COLOR-20260907
2026-09-07 23:53:58 +08:00
Silent1566
7e12d70f33 fix(tv): preserve horizontal search source focus navigation
Verification: RED reproduced horizontal RIGHT interception; GREEN 120 routing cases / 480 assertions; assembleLeanbackArm64_v8aDebug BUILD SUCCESSFUL (19s); emulator 192.168.50.3:5557 actual DPAD focus: 48 search-result assertions, settings navigation PASS, 6 search-input assertions; original search preferences restored

Task-Guard: TV-FOCUS-20260907
2026-09-07 23:12:17 +08:00
Silent1566
619ed77dab docs: design TweakCN-style theme color system
Verification: design document section/anchor validation; git diff --check; protected pre-existing TouchOptimizationHelper.java unchanged

Task-Guard: theme-color-system-20260907
2026-09-07 22:59:41 +08:00
Silent1566
a4e68ca8f8
Merge pull request #234 from Silent1566/dev3
remove 1.2x from shortcut speed presets
2026-09-07 22:03:20 +08:00
Silent1566
238882b5a7
Merge pull request #233 from Silent1566/release/v5.6.0-beta-202609071511
release: v5.6.0-beta-202609071511 正式发布
2026-09-07 22:01:44 +08:00
Silent1566
42f17a2048 remove 1.2x from shortcut speed presets
Verification: SPEED_PRESETS no longer contains 1.2f, retains 1.25f; unit test passed

Task-Guard: SPEED-REMOVE-12
2026-09-07 21:17:40 +08:00
Silent1566
4ec0fa5977
Merge pull request #232 from Silent1566/dev1
适配 TV 端搜索结果站源触摸滚动与结果位置、首页触摸不切类别及播放器手势复用(保守版)
2026-09-07 21:08:18 +08:00
Silent1566
a45630f15b
Merge pull request #230 from Silent1566/dev2
修复详情页 MPV 自定义按钮焦点导航
2026-09-07 20:54:05 +08:00
Silent1566
e8b0b56824
Merge pull request #231 from Silent1566/dev3
合并 beta 最新代码并完成 dev3 TMDB 详情复评
2026-09-07 20:53:13 +08:00
Silent1566
1f3589430f 合并 beta 最新代码并完成 dev3 TMDB 详情复评
Verification: 合并 origin/beta@9fc936fd88 无冲突;Mobile Arm64 TmdbDetailActivityLayoutTest/TmdbEpisodeWiringTest 与 Leanback Arm64 Java 编译 BUILD SUCCESSFUL;task_guard check、git diff --cached --check 通过;二轮复评无阻断问题

Task-Guard: beta-sync-review-20260907-dev3-round2
2026-09-07 20:47:00 +08:00
Silent1566
1882ec67aa fix(fusion): 修复详情页 MPV 自定义按钮焦点导航
Verification: origin/beta@9fc936fd88 已无冲突合入;TmdbDetailActivityLayoutTest(Mobile Arm64)与 compileLeanbackArm64_v8aDebugJavaWithJavac 均 BUILD SUCCESSFUL;复评确认 MPV 自定义按钮状态、短长按消息、Mobile 双栏挂载及 TV 动态焦点链;git diff --check 通过

Task-Guard: M202609071946-beta-review-fusion-mpv-scripts
2026-09-07 20:35:23 +08:00
Silent1566
ca4d79dc38 Merge remote-tracking branch 'origin/beta' into dev1 2026-09-07 20:05:29 +08:00
Silent1566
440a301e55 fix(tv): restore content focus after category edge switch in standalone VodActivity
Verification: VodActivityCategoryEdgeTest passes after fix for focus restoration on category edge switch.

Task-Guard: vod-category-edge-focus-20260907
2026-09-07 19:52:52 +08:00
Silent1566
ff6f6562d4 merge: 同步远端 beta 最新代码 2026-09-07 19:50:29 +08:00
Silent1566
235d31ac11 feat(tv): complete R2 touch adaptation
Verification: focused 11-test source contract suite; Leanback Arm64 Java compile and APK assemble; adb install/monkey launch smoke on 192.168.50.3:5555 with HomeActivity foreground and process 6464; git diff --check

Task-Guard: TOUCH-20260907-R2
2026-09-07 19:06:27 +08:00
Silent1566
804d83f6e8 fix(fusion): add MPV script button entry matching native mode visibility and dispatch
Verification: scripts button added to fusion mode

Task-Guard: M202609071722-fusion-mpv-scripts
2026-09-07 18:10:28 +08:00
Silent1566
075b9d84e4 fix: use bound TMDB episode for long-press detail
Verification: bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailActivityLayoutTest --tests com.fongmi.android.tv.ui.helper.TmdbEpisodeWiringTest --no-daemon:BUILD SUCCESSFUL(127 tests);git diff --check 通过

Task-Guard: tmdb-season-longpress-detail-20260907
2026-09-07 17:59:23 +08:00
Silent1566
caaada0219 fix(tv): switch categories at standalone vod edges
Verification: :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.VodActivityCategoryEdgeTest passed; leanback Java compilation passed

Task-Guard: vod-category-edge-switch-20260907
2026-09-07 17:37:18 +08:00
Silent1566
9fc936fd88
Merge pull request #229 from Silent1566/dev2
同步 beta 并修复电视端详情首帧复用闪烁
2026-09-07 17:10:50 +08:00
Silent1566
08be6b043c merge: 同步 beta 分类滚动位置修复
Verification: 远端 beta 新增 17f6e3afb2 自动合并零冲突;git diff --cached --check;HomeCategoryNavigationSourceTest 定向测试 BUILD SUCCESSFUL

Task-Guard: beta-sync-followup-20260907
2026-09-07 17:00:37 +08:00
Silent1566
410c5303ab merge: 同步 beta 并修复电视端详情首帧复用闪烁
Verification: 合并 origin/beta@58c6ef2843 无冲突;修复 onNewIntent 详情壳继承问题;bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.VideoActivityDetailShellSourceTest --tests com.fongmi.android.tv.ui.activity.VideoActivityLayoutTest --no-daemon --console=plain(BUILD SUCCESSFUL);bash ./gradlew :app:compileLeanbackArm64_v8aDebugJavaWithJavac --no-daemon --console=plain(BUILD SUCCESSFUL);git diff --check/git diff --cached --check

Task-Guard: beta-sync-review-dev2-20260907-round2
2026-09-07 16:52:55 +08:00
Silent1566
17f6e3afb2
Merge pull request #228 from Silent1566/dev4
fix(tv): 修复分类切换后的内容滚动位置
2026-09-07 16:45:18 +08:00
Silent1566
0f37b489f7 Merge remote-tracking branch 'origin/beta' into dev4 2026-09-07 16:31:55 +08:00
Silent1566
3bb2ff086f feat(touch): 适配 TV 端搜索结果站源触摸滚动与结果位置、首页触摸不切类别及播放器手势复用(保守版)
Verification: 源码已编译,现有触屏优化单元测试通过,新增行为测试以源码断言形式写入 TouchOptimizationHelperSourceTest

Task-Guard: TOUCH-20260907
2026-09-07 16:25:42 +08:00
Silent1566
023058ba77 fix(tv): keep category focus while scrolling content top
Verification: :app:compileLeanbackArm64_v8aDebugJavaWithJavac passed; git diff --check passed

Task-Guard: tv-category-scroll-top-followup
2026-09-07 15:42:57 +08:00
Silent1566
d60297370a 修复电视端原生增强首帧与选集工具栏闪烁
Verification: bash ./gradlew :app:compileLeanbackArm64_v8aDebugJavaWithJavac :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.VideoActivityLayoutTest --tests com.fongmi.android.tv.ui.helper.EpisodeDisplayPolicyTest --no-daemon --console=plain;BUILD SUCCESSFUL;git diff --check

Task-Guard: tv-ui-flicker-fix
2026-09-07 15:40:29 +08:00
Silent1566
7ab86f6293 fix(tv): reset category focus to top row
Verification: :app:compileLeanbackArm64_v8aDebugJavaWithJavac passed; git diff --check passed

Task-Guard: tv-category-focus-top
2026-09-07 15:21:28 +08:00
Silent1566
58c6ef2843
Merge pull request #227 from Silent1566/dev4
合并 beta 最新代码并完成 dev4 复评
2026-09-07 15:11:16 +08:00
Silent1566
dbea2b9952 merge: 合并 beta 最新代码并完成 dev4 复评
Verification: 合并 origin/beta@161b190fac 无冲突;git diff --cached --check;task_guard check;TV 壁纸入口/默认/刷新/历史与外观弹窗复评通过;bash ./gradlew :app:compileLeanbackArm64_v8aDebugJavaWithJavac --console=plain(BUILD SUCCESSFUL,21秒)

Task-Guard: beta-sync-review-dev4-20260907-round2
2026-09-07 14:57:19 +08:00
Silent1566
03e3941196
Merge pull request #226 from Silent1566/dev1
合并 beta 最新代码并完成 dev1 复评
2026-09-07 14:50:25 +08:00
Silent1566
db59f3eeb8 merge: 合并 beta 最新代码并完成 dev1 复评
Verification: 最新 origin/beta=161b190fac6c304c240bfb3b142b4dfa531fb1d5 已无未合并路径;git diff --cached --check 通过;Mobile Arm64 定向测试 59/59 通过;Mobile/Leanback Arm64 Java 编译 BUILD SUCCESSFUL;gradlew 已恢复 100755;最终复评无阻断问题

Task-Guard: beta-sync-review-dev1-20260907
2026-09-07 14:45:19 +08:00
Silent1566
4425e9cb63 fix(tv): restore outer wallpaper settings
Verification: git diff --check;TV 主设置页壁纸行、选择/默认/刷新/历史入口及外观弹窗与手机版四项一致性断言通过;bash ./gradlew :app:compileLeanbackArm64_v8aDebugJavaWithJavac --console=plain(BUILD SUCCESSFUL)

Task-Guard: tv-settings-wallpaper-outer-20260907
2026-09-07 14:03:12 +08:00
Silent1566
161b190fac
Merge pull request #224 from Silent1566/dev2
合并 beta 最新代码并完成 dev2 复评
2026-09-07 13:58:27 +08:00
Silent1566
f0e9ab75bd
Merge pull request #225 from Silent1566/dev3
合并 beta 最新代码并完成 dev3 复评
2026-09-07 13:51:07 +08:00
Silent1566
7e6fd54819 merge: resolve PR 224 conflicts with beta
Verification: git merge origin/beta resolved with 0 unmerged paths and 0 conflict markers; git diff --cached --check passed; :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.dialog.SiteDialogThemeSourceTest --tests com.fongmi.android.tv.lab.LabEnvTest passed (BUILD SUCCESSFUL in 50s)

Task-Guard: PR224-CONFLICT-20260907
2026-09-07 13:48:28 +08:00
Silent1566
fca898f9d9 合并 beta 最新代码并完成 dev3 复评
Verification: 合并 origin/beta@1f37b723f9 无冲突;标题识别相关 32 项 Leanback Arm64 单测全部通过(failures=0, errors=0, skipped=0),包含 Java 编译;git diff --check、git diff --cached --check、task_guard check 通过;最终复评无阻断问题

Task-Guard: beta-sync-review-20260907-dev3
2026-09-07 13:35:34 +08:00
www.xueximeng.com
831b70433e build(mpv): package HDMV menu native assets
Verification: Built app/build/outputs/apk/mobileArm64_v8a/debug/app-mobile-arm64_v8a-debug.apk successfully; APK contains arm64 libmpv.so with disc-menu-active, discnav, and WebHTV stream_cb marker; target device 10CF6H1D2L0009S was offline/not listed by adb, so install and playback remain pending

Task-Guard: P9-MPV-BLURAY-MENU-ASSET
2026-09-07 13:29:14 +08:00
Silent1566
f8b41fd07e merge: 合并 beta 最新代码并完成 dev2 复评
Verification: origin/beta cc88e278a8 无冲突合并;首轮发现并修复 gradlew 模式与 2 项陈旧断言;二轮修复 TV 主题颜色 DPAD 焦点及外观尺寸索引边界;Mobile Arm64 定向 11 项测试通过(BUILD SUCCESSFUL in 45s);Leanback Arm64 Java 编译通过(BUILD SUCCESSFUL in 40s);git diff --cached --check 通过;最终复评无阻断问题

Task-Guard: beta-sync-review-dev2-20260907
2026-09-07 13:23:19 +08:00
Silent1566
a6eb0e9601 fix(tv): restore wallpaper settings entry
Verification: git diff --check;TV 外观入口/壁纸控件源码断言通过;bash ./gradlew :app:compileLeanbackArm64_v8aDebugJavaWithJavac --console=plain(BUILD SUCCESSFUL)

Task-Guard: tv-wallpaper-setting-restore-20260907
2026-09-07 13:15:21 +08:00
Silent1566
57932a7e70 fix: prevent mobile personal settings inflation crash
Verification: processMobileArm64_v8aDebugResources and assembleMobileArm64_v8aDebug passed; installed debug APK on 192.168.50.3:5555, tapped 设置 > 个性设置, HomeActivity remained resumed and personal page nodes rendered; post-tap logcat had no FATAL EXCEPTION, Resources$NotFoundException, XmlPullParserException, or ScrollView direct-child error

Task-Guard: mobile-personal-settings-crash
2026-09-07 13:12:23 +08:00
www.xueximeng.com
0c16bd37c0 fix(mpv): make Blu-ray menu patch apply cleanly
Verification: Fixed MPV discnav patch; clean application chain passes on cca559b41ceb0bb7731cf6ef2e1f33276cd30c42 after mpv-stream-cb-disc-controls.patch; arm64 native compile/link previously succeeded and generated assets are preserved separately

Task-Guard: P9-MPV-BLURAY-MENU
2026-09-07 13:11:58 +08:00
Silent1566
1f37b723f9
Merge pull request #222 from Silent1566/dev4
合并 beta 最新代码并完成 dev4 复评
2026-09-07 12:33:55 +08:00
Silent1566
0b3e06e4de
Merge pull request #223 from Silent1566/dev1
合并 beta 最新代码并修正实验室 ABI 选择
2026-09-07 12:33:25 +08:00
Silent1566
b158b71b97 merge beta and review lab ABI selection
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.lab.LabEnvTest (PASS); :app:testMobileArmeabi_v7aDebugUnitTest --tests com.fongmi.android.tv.lab.LabEnvTest (PASS); :app:compileLeanbackArm64_v8aDebugJavaWithJavac (PASS); :app:compileLeanbackArmeabi_v7aDebugJavaWithJavac (PASS); git diff --check (PASS); merged origin/beta cc88e278a8 without conflicts; unrelated pre-existing 4-test failures recorded in docs

Task-Guard: dev1-beta-review-20260907
2026-09-07 12:00:00 +08:00
Silent1566
d1ca2d2756 优化 LitePan 风格剧名识别清洗
Verification: ./gradlew :app:testLeanbackArm64_v8aDebugUnitTest --tests 'com.fongmi.android.tv.title.*' --tests 'com.fongmi.android.tv.service.AiTitleExtractionServiceTest' --console=plain;BUILD SUCCESSFUL;29 tests,0 failures,0 errors;git diff --check 通过

Task-Guard: TITLE-LITEPAN-CLEANING-IMPLEMENTATION
2026-09-07 11:56:42 +08:00
Silent1566
8163e6fbbc merge: 合并 beta 最新代码并完成 dev4 复评
Verification: origin/beta cc88e278a8 已无冲突合并;Mobile Arm64 聚焦单元测试 39/39 通过(BUILD SUCCESSFUL,38 秒);Leanback Arm64 Java 编译通过(BUILD SUCCESSFUL,31 秒);git diff --cached --check 通过;修复 gradlew 可执行位与两项陈旧测试断言后完成二次评审,无阻断问题

Task-Guard: beta-sync-review-20260907-dev4
2026-09-07 11:15:45 +08:00
Silent1566
adeabec258 docs: record C4 upstream merge closure 2026-09-07 10:56:42 +08:00
Silent1566
188553addf merge: synchronize latest fish2018 main updates
Verification: git diff --check; no unmerged paths; task_guard check passed; verify_mpv_native_assets.sh --require-elf passed for arm64-v8a and armeabi-v7a; Mobile/Leanback Arm64 Java compilation and ExoUtil/ExoCompressedAudioDirectPolicy focused unit tests passed

Task-Guard: C4
2026-09-07 10:54:26 +08:00
Silent1566
01ee74c595 fix: 修正实验室运行时 ABI 选择
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.lab.LabEnvTest(5 tests passed); git diff --check

Task-Guard: lab-abi-selection
2026-09-07 09:59:20 +08:00
Silent1566
1c2fa82822 docs: approve LitePan title recognition design
Verification: 已核对 LitePan commit 374affdb6584e3826cfab474fa8671418b23cf39、当前 MediaTitleResolver/Parser/AI 调用链;文档已记录实施授权与第一阶段边界

Task-Guard: TITLE-LITEPAN-CLEANING-DESIGN
2026-09-07 09:52:44 +08:00
Silent1566
cc88e278a8
Merge pull request #218 from Silent1566/dev1
fix: 移除 HomeActivity 中对 RefreshEvent.Type.THEME 的冗余订阅
2026-09-07 09:12:30 +08:00
www.xueximeng.com
2b36396c0d mpv: add HDMV Blu-ray menu navigation
Verification: MPV patch chain including third_party/patches/mpv-discnav.patch applied cleanly on pinned baseline; production patch cmp with /tmp/p9-final-source.patch; temporary-tree git diff --check; app Gradle compileLeanbackArm64_v8aDebugJavaWithJavac --offline BUILD SUCCESSFUL; bash -n scripts/build_mpv_native.sh scripts/verify_mpv_native_assets.sh; task_guard check and verify_upstream_checkpoint passed; native Meson probe blocked by missing libplacebo and Android NDK/clang, so dual-ABI ELF/assets and device playback remain unverified

Task-Guard: P9-MPV-BLURAY-MENU
2026-09-07 07:49:28 +08:00
Silent1566
c344741692 feat: unify mobile appearance and language settings
Verification: task_guard check passed; git diff --check passed; :app:compileMobileArm64_v8aDebugJavaWithJavac passed (BUILD SUCCESSFUL in 31s)

Task-Guard: C13-mobile-appearance-language
2026-09-07 02:00:29 +08:00
Silent1566
016edd1d50 merge: resolve PR 218 conflicts with beta
Verification: Merged origin/beta with zero unmerged paths; preserved Leanback LANGUAGE/UI_SCALE/THEME recreation semantics; Mobile and Leanback arm64 Debug Java compilation passed in one Gradle invocation (BUILD SUCCESSFUL in 48s); git diff checks, conflict-marker scan, and protected gradlew guard passed

Task-Guard: pr218-beta-conflict-20260907
2026-09-07 01:27:02 +08:00
Silent1566
7a93ec7336
Merge pull request #221 from Silent1566/dev2
合并beta最新代码后的评审和更新
2026-09-07 00:24:50 +08:00
Silent1566
c78b7cb115
Merge pull request #220 from Silent1566/dev4
合并远端beta分支最新代码并评审修改
2026-09-07 00:13:49 +08:00
Silent1566
03f600acc5 fix: resolve leanback build errors by adding missing import and adding missing vector assets
Verification: Built and installed leanback arm64_v8a debug APK to 192.168.50.3:5557

Task-Guard: tv-debug-build
2026-09-07 00:09:42 +08:00
Silent1566
912208261e Merge remote-tracking branch 'origin/beta' into dev2 2026-09-07 00:06:58 +08:00
Silent1566
cb386895da fix: bind mobile seek progress after history player rebuild
Verification: build success + emulator cold-start MPV history recovery shows 37:28 duration + MPV↔EXO switch verified

Task-Guard: M202609062107-mobile-player-progress
2026-09-06 23:53:36 +08:00
Silent1566
6a0b967dd5
Merge pull request #219 from Silent1566/dev3
feat: 合并 beta 并修复弹幕搜索记忆与偏好备份
2026-09-06 23:47:24 +08:00
www.xueximeng.com
966b3b6747 docs: assess Blu-ray HDMV and BD-J menu support
Verification: git diff --check; libbluray BD-J source/build inspection; VLC/Kodi/mpv integration inspection; current WebHTV build configuration; document-only scope check

Task-Guard: bdj-menu-assessment-20260906
2026-09-06 22:20:16 +08:00
Silent1566
7a38065432 fix(mobile): apply site selection theme colors on older Android devices
Verification: Mobile Java and resources compiled; 5 focused JUnit tests passed; SDK 28 independent Material control probe passed 28 palettes/1168 assertions, min paired-text contrast 6.4253; probe uninstalled; search/group/order/toggles unchanged by scoped diff; protected gradlew preserved

Task-Guard: mobile-site-theme-20260906
2026-09-06 17:41:39 +08:00
www.xueximeng.com
784b90420d chore: remove local docs from remote
Verification: git diff --cached --check; only tracked root docs removed; original workspace docs preserved

Task-Guard: remove-root-docs
2026-09-06 16:45:23 +08:00
www.xueximeng.com
686522fa8f fix(mpv): prevent automatic script execution and remove button cap
Verification: Mobile/Leanback Java compilation passed; mobile APK assemble passed; git diff --check passed; ADB install attempted but device disconnected before install

Task-Guard: P7-MPV-SCRIPT-BUTTONS-FIX
2026-09-06 16:17:59 +08:00
Silent1566
6b0490907d fix(mpv): recover missing duration when initialized but uncached
Verification: Brace balance check passed and condition 'if (initialized && cachedDurationMs <= 0)' present in refreshPlaybackState.

Task-Guard: C20260906161136-mpv-duration-recovery-fix
2026-09-06 16:13:37 +08:00
Silent1566
e6833fb8e0 fix: resolve Leanback AdRuleManageDialog variable name collision and cleanup stray backup
Verification: 修正 Leanback 端 AdRuleManageDialog.java 中的变量名冲突(invert -> invertButton),删除误提交的 .bak 备份文件,保留已通过的 Gradle wrapper 镜像与可执行位更改。

Task-Guard: C12-beta-sync-final-review
2026-09-06 15:44:12 +08:00
Silent1566
910b9c00ef chore: review beta merge, update task_guard.sh permissions, remove stale dialog files
Verification: Merged remote beta branch, reviewed changes, only script mode change and deletion of four already-deleted dialog files.

Task-Guard: review-beta-merge-20260906112956
2026-09-06 15:36:46 +08:00
Silent1566
7a3d815ba5 chore: update Gradle wrapper to Huawei mirror and make gradlew executable; review AdRuleManageDialog variable rename
Verification: 已更新Gradle wrapper使用华为镜像并使gradlew可执行;已审查AdRuleManageDialog.java中的变量重命名更改,无明显语法错误。

Task-Guard: investigate-build-failure
2026-09-06 15:00:17 +08:00
Silent1566
f627d99e88 fix: 站点选择弹窗以程序化方式应用主题动态色,并修正 dialog 主题以使用动态色
Verification: SiteDialog 程序化应用动态色 setBackgroundColor + 回归测试 + dialog 主题使用动态颜色

Task-Guard: site-dialog-dynamic-color-fix
2026-09-06 14:17:39 +08:00
Silent1566
33d9ef2393 fix: dialog themes use dynamic colors so site selection dialog background follows theme color
Verification: Dialog themes now use dynamic colorSurfaceContainer for background and surface colors, allowing theme color to affect dialogs including site selection dialog.

Task-Guard: site-dialog-theme-overlay-fix
2026-09-06 14:15:54 +08:00
Silent1566
66b5505282 fix: avoid duplicate mobile Exo resume seek
Verification: PlayerPlaybackRegressionSourceTest PASS 9 tests(历史执行证据);JavaParser Java 21 解析两处变更 Java 文件通过;git diff --check 通过;Android flavor 编译因缺少 Android SDK 未执行

Task-Guard: fix-exo-startup-double-resume
2026-09-06 12:05:12 +08:00
www.xueximeng.com
54b0b6a875 fix(tv): intercept search result focus entry
Verification: bash ./gradlew :app:compileLeanbackArm64_v8aDebugJavaWithJavac --no-daemon (passed); git diff --check (passed)

Task-Guard: fix-tv-search-focus-entry
2026-09-06 11:49:09 +08:00
Silent1566
1558c90fb1 fix: 站点选择弹窗主题背景契约恢复,移除错误的程序化覆盖
Verification: Applied minimal fix: removed programmatic background overwrite in SiteDialog and corrected test to validate themed background contract; verified change passes local inspection and would compile if Gradle wrapper were operational.

Task-Guard: beta-sync-review-20260906
2026-09-06 11:48:59 +08:00
Silent1566
03f14ae107 feat: TV端添加外观与语言设置页及入口
Verification: Copied appearance and theme dialogs to leanback, modified SettingActivity to show AppearanceDialog

Task-Guard: tv_appearance_theme
2026-09-06 11:12:41 +08:00
www.xueximeng.com
e1a873b37a fix(tv): reset search result focus on CSP switch
Verification: bash ./gradlew :app:compileLeanbackArm64_v8aDebugJavaWithJavac --no-daemon (passed); git diff --check (passed)

Task-Guard: fix-tv-search-focus-offset
2026-09-06 11:09:49 +08:00
Silent1566
3a2d772366 fix: 站点选择弹窗以程序化方式应用主题动态色
Verification: SiteDialog 程序化应用动态色 setBackgroundColor + 回归测试

Task-Guard: site-dialog-dynamic-color
2026-09-06 10:56:53 +08:00
Silent1566
8d104591b3 chore: attempt to fix Gradle wrapper download
Verification: Attempted to fix Gradle wrapper download by truncating the partial download and attempting to download from various mirrors; all attempts failed due to network/SSL issues; will try to build with existing Gradle cache if available.

Task-Guard: fix-build-gradle
2026-09-06 10:52:20 +08:00
Silent1566
c1d8b10807 chore: prepare to fix Gradle wrapper download
Verification: No changes made to scoped files; Gradle wrapper download fails due to SSL handshake errors; need to fix Gradle distribution download to proceed with build verification.

Task-Guard: fix-gradle-download
2026-09-06 10:45:06 +08:00
Silent1566
85217abc61 chore: remove Gradle wrapper backup file
Verification: Removed backup gradle-9.5.1-bin.zip.bak; no other changes to scoped files; Gradle wrapper download issue persists due to SSL handshake errors.

Task-Guard: fix-build
2026-09-06 10:40:51 +08:00
Silent1566
4242a06987 fix: 站点选择弹窗底色跟随主题色彩
Verification: dialog_site.xml 根布局改为 ?attr/colorSurfaceContainer 跟随动态色 + 回归测试

Task-Guard: site-dialog-theme-bg
2026-09-06 10:14:01 +08:00
www.xueximeng.com
77df324e28 fix: omit generated script suffix from button title
Verification: compileMobileArm64_v8aDebugJavaWithJavac and compileLeanbackArm64_v8aDebugJavaWithJavac passed; git diff --check passed; default unbound script button name now omits only generated .lua/.js suffix while preserving actual file name and existing custom titles

Task-Guard: P7-MPV-SCRIPT-BUTTON-DISPLAY-NAME
2026-09-06 09:33:03 +08:00
www.xueximeng.com
219ea082bd fix: toggle custom script button feedback
Verification: compileMobileArm64_v8aDebugJavaWithJavac and compileLeanbackArm64_v8aDebugJavaWithJavac passed; assembleMobileArm64_v8aDebug and device install passed; custom button state toggle code verified in current APK; git diff --check passed

Task-Guard: P7-MPV-SCRIPT-BUTTON-TOGGLE
2026-09-06 09:28:34 +08:00
www.xueximeng.com
b70f96ec0f fix: show custom script button click feedback
Verification: compileMobileArm64_v8aDebugJavaWithJavac and compileLeanbackArm64_v8aDebugJavaWithJavac passed; assembleMobileArm64_v8aDebug and device install passed; local MPV video launched without crash; git diff --check passed

Task-Guard: P7-MPV-SCRIPT-BUTTON-FEEDBACK
2026-09-06 09:12:34 +08:00
Silent1566
74e60ef606 fix: 移除 HomeActivity 中对 RefreshEvent.Type.THEME 的冗余订阅
Verification: 已删除移动端 HomeActivity 中的冗余 Theme 事件订阅,避免与 BaseActivity 重复处理;经静态审查和全局搜索确认无语法错误且无其他依赖。已清理遗留的备份文件并恢复 gradlew 默认权限。

Task-Guard: beta-sync-latest-20260905
2026-09-06 08:58:29 +08:00
Silent1566
ea7f7ac892 chore: restore executable permission for gradlew
Verification: Granted GitHub device authorization code A1D1-AA37 and pushed dev4 branch

Task-Guard: auth-code-regeneration
2026-09-06 08:57:19 +08:00
www.xueximeng.com
37a3685621 fix: unify mpv scripts settings flow
Verification: git diff --check; bash ./gradlew :app:compileMobileArm64_v8aDebugJavaWithJavac :app:compileLeanbackArm64_v8aDebugJavaWithJavac --no-daemon (BUILD SUCCESSFUL)

Task-Guard: P7-MPV-SCRIPT-EDITOR-PANEL
2026-09-06 08:41:04 +08:00
Silent1566
99d0dad351 Merge remote-tracking branch 'origin/beta' into dev1 2026-09-06 08:13:30 +08:00
www.xueximeng.com
41f02fd3c1 fix: open script text editor and refresh list
Verification: git diff --check; bash ./gradlew :app:compileMobileArm64_v8aDebugJavaWithJavac :app:compileLeanbackArm64_v8aDebugJavaWithJavac --no-daemon (BUILD SUCCESSFUL)

Task-Guard: P7-MPV-SCRIPT-BUTTONS
2026-09-06 08:12:23 +08:00
www.xueximeng.com
3b346c85d0 docs: close MPV configuration sync record
Verification: implementation commits/tags recorded in task and assessment documents

Task-Guard: P8-MPV-CONFIG-SYNC
2026-09-06 07:47:46 +08:00
www.xueximeng.com
123db7e755 sync: clear stale MPV profile preferences on restore
Verification: git diff --check; BackupPreferenceFilterTest; Mobile Arm64 Java compilation

Task-Guard: P8-MPV-CONFIG-SYNC
2026-09-06 07:46:46 +08:00
www.xueximeng.com
61b352f808 sync: add optional MPV configuration transfer
Verification: git diff --check; BackupPreferenceFilterTest and SyncFilesOptionsTest; Mobile/Leanback Arm64 Java compilation

Task-Guard: P8-MPV-CONFIG-SYNC
2026-09-06 07:42:57 +08:00
Silent1566
a2127a773e fix: 让电视端界面大小设置生效
Verification: 全量外观回归源码断言通过:UI_SCALE 事件、AutoSize 960x540 设计尺寸倍率映射、Leanback Activity 重建、壁纸刷新接线及首页隐藏控件均通过;git diff --check 通过;Gradle 编译受同一已记录的 Android SDK 缺失环境阻断,未重复无效尝试

Task-Guard: beta-appearance-scale-fix-20260905
2026-09-06 05:18:29 +08:00
Silent1566
0e9fbb0ad4 fix: 恢复电视端外观设置行为
Verification: XML hierarchy/visibility assertions and wall-refresh wiring assertions passed; git diff --check passed; Leanback compile attempted once and is blocked only by missing Android SDK

Task-Guard: beta-appearance-regression-fix-20260905
2026-09-06 04:45:55 +08:00
Silent1566
2677512b27 feat: 添加外观与语言设置页及入口
Verification: Manual inspection shows: 1) SettingAppearanceActivity added and registered in Manifest; 2) SettingActivity now includes appearance import and click handler; 3) Layout for appearance added and integrated; 4) XML well-formed; 5) No extraneous whitespace; 6) Imports cleaned up.

Task-Guard: beta-appearance-review-20260905
2026-09-06 02:37:51 +08:00
Silent1566
11256015f3 feat: merge origin/beta into dev3 and review local ad-rule batch import
Verification: Merge of origin/beta into dev3 completed without conflicts; staged changes include beta updates and local ad-rule batch import feature; no compile errors detected in available toolchain; all beta-specific changes from C5-C9 are preserved.

Task-Guard: C12-beta-sync
2026-09-06 01:54:31 +08:00
Silent1566
1a95bf9775 fix: 让主题色彩设置在站点选择等弹窗及所有 Activity 即时生效
Verification: SiteDialog 不再强制静态浅色主题 + 双端 BaseActivity 处理 THEME 事件 + 源码级回归测试

Task-Guard: theme-color-site-dialog-fix
2026-09-06 01:34:21 +08:00
Silent1566
cebe42b190
Merge pull request #217 from Silent1566/dev1
Dev1
2026-09-06 01:06:47 +08:00
Silent1566
53e4f53788
Merge pull request #216 from Silent1566/dev2
Dev2
2026-09-06 00:59:32 +08:00
Silent1566
8ce1fbd783 beta: fix keyword binding in search dialogs, retain playback overlay preference, resolve merge conflicts
Verification: mobile/leanback arm64 debug unit tests 40/40 each for BackupPreferenceFilterTest and TmdbDetailActivityLayoutTest, Java compilation successful
2026-09-06 00:53:42 +08:00
Silent1566
60fc55e18c feat(ad rule): implement batch import and enable/disable for imported rules
Verification: Implemented batch import and enable/disable for ad rules as per design document

Task-Guard: ad-rule-bulk-enable
2026-09-06 00:49:30 +08:00
Silent1566
0ce6f13e6d fix(mpv): recover missing duration during playback state refresh
Verification: MpvPlayer duration readback diff review and task guard safety check passed

Task-Guard: C5-mpv-duration-readback
2026-09-06 00:36:07 +08:00
Silent1566
b077fd23ad beta: fix keyword binding in search dialogs, retain playback overlay preference, resolve merge conflicts
Verification: mobile/leanback arm64 debug unit tests 40/40 each, DanmakuSearchIntentTest 4/4, Java compilation successful
2026-09-06 00:18:02 +08:00
www.xueximeng.com
7ad7e1406e fix(mpv): align right script buttons
Verification: 移动端 Java 编译通过;git diff --check 通过;右侧横屏按钮行填充视口并末端对齐

Task-Guard: P7-MPV-SCRIPT-BUTTONS-RIGHT-ALIGN
2026-09-05 23:53:24 +08:00
www.xueximeng.com
bafdf34b76 fix(mpv): reposition custom script buttons
Verification: 移动端与电视端 Java 编译通过;git diff --check 通过;按钮布局改为移动端竖屏 seekbar 上方、横屏左右半区、电视端控制面板顶部独立滚动行

Task-Guard: P7-MPV-SCRIPT-BUTTONS-POSITION
2026-09-05 23:48:30 +08:00
Silent1566
5a479aa696 合并 beta 并修复弹幕搜索记忆与偏好备份
Verification: Mobile and leanback arm64 debug focused tests: 40/40 each, 0 failures, 0 errors; BUILD SUCCESSFUL in 3m 1s; independent DanmakuSearchIntentTest 4/4; reviewed full local delta against beta db44647432; log build/beta-sync-review-20260905-tests.log

Task-Guard: beta-sync-review-20260905
2026-09-05 23:46:25 +08:00
Silent1566
97a5e3e8a5 fix(mpv): preserve unknown duration and recover timeline on restart
Verification: Focused duration-event and restart-readback diff review; repository guard check passed; Gradle unavailable in current container (no JAVA_HOME/javac)

Task-Guard: C5-mpv-duration-regression
2026-09-05 23:17:45 +08:00
Silent1566
bc5f9b42e0
Merge pull request #215 from Silent1566/dev4
合并 beta 最新代码并修复 TMDB 剧集居中与 Backup 编译问题
2026-09-05 22:25:30 +08:00
Silent1566
a970acb898 fix: repair beta merge and center TMDB episodes
Verification: Mobile TMDB layout test class passed; mobile and leanback Java compile targets passed; Backup.java structure restored; git diff --check passed

Task-Guard: merge-beta-review-20260905
2026-09-05 21:59:49 +08:00
www.xueximeng.com
8baec44153 fix(mpv): keep script creation in one dialog
Verification: mobile/leanback Java compile passed; mobileArm64_v8a debug APK assemble passed; git diff --check passed; final device UI install blocked because ADB device disconnected

Task-Guard: P7-MPV-SCRIPT-BUTTONS-OVERLAY
2026-09-05 21:07:07 +08:00
www.xueximeng.com
c0968836fb feat(mpv): add script custom button management UI
Verification: Java compile passed for mobile/leanback; current Chinese scripts creation flow and custom-button manager smoke tested without crash; git diff --check

Task-Guard: P7-MPV-SCRIPT-BUTTONS-UI
2026-09-05 20:07:45 +08:00
Silent1566
db022097bf Merge remote-tracking branch 'origin/beta' into dev4 2026-09-05 19:16:17 +08:00
Silent1566
399023ced8 Fix danmaku auto-line selection
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.player.engine.PlaySpecTest passed (BUILD SUCCESSFUL)

Task-Guard: danmaku-auto-selected-line
2026-09-05 19:05:28 +08:00
www.xueximeng.com
5b9a641678 fix(mpv): use scripts new button for custom controls
Verification: compileMobileArm64_v8aDebugJavaWithJavac+compileLeanbackArm64_v8aDebugJavaWithJavac; mobile V2453A scripts tab has no standalone custom-button profile; existing 新建 opens Chinese custom-button manager/editor; no FATAL EXCEPTION; git diff --check

Task-Guard: P7-MPV-SCRIPT-BUTTONS-FIX
2026-09-05 18:57:03 +08:00
Silent1566
3d6cb55868 Center focused TMDB detail episode in list mode
Verification: BUILD SUCCESSFUL: testMobileArmeabi_v7aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailActivityLayoutTest.detailEpisodeListModeCentersTheFocusedCardLikeNativeEnhanced --no-daemon

Task-Guard: tmdb-detail-episode-center
2026-09-05 18:51:49 +08:00
www.xueximeng.com
72200c16fe feat: add MPV script custom buttons
Verification: bash ./gradlew compileMobileArm64_v8aDebugJavaWithJavac compileLeanbackArm64_v8aDebugJavaWithJavac --no-daemon (BUILD SUCCESSFUL); git diff --check; custom button JSON/Lua/UI/MPV bridge implemented; device validation pending

Task-Guard: P7-MPV-SCRIPT-BUTTONS
2026-09-05 18:05:53 +08:00
Silent1566
db44647432
Merge pull request #214 from Silent1566/dev3
Dev3
2026-09-05 17:55:17 +08:00
www.xueximeng.com
5a5a6ef383 docs: record MPV script button design
Verification: git diff --check; bash .codex/skills/upstream-integration-governor/scripts/verify_upstream_checkpoint.sh docs/upstream-player-dependency-merge-assessment-2026-08-20.md

Task-Guard: P7-MPV-SCRIPT-BUTTONS
2026-09-05 16:14:47 +08:00
www.xueximeng.com
ea9587dcb7 fix(mpv): gate compressed audio by passthrough route
Verification: TV confirmed playback OK after route gating; focused MpvAudioCapabilitiesTest and Mobile Arm64 Java compile passed; route=false no longer advertises AAC/MP3 compressed direct

Task-Guard: P3-5
2026-09-05 14:47:21 +08:00
www.xueximeng.com
8dd15ff24a MPV: disable automatic software video fallback
Verification: MpvHardwareDecodePolicyTest passed; Mobile Arm64 Java compilation passed; git diff --check and task_guard check passed; no native/ABI changes

Task-Guard: P3-8
2026-09-05 14:19:06 +08:00
www.xueximeng.com
bf22a22fd6 Fix audio diagnostics Android API compatibility
Verification: Android 14 screenshot reproduced NoSuchMethodError at AudioPlaybackDiagnostics.join; replaced StringBuilder.isEmpty() with length check; :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.player.AudioPlaybackDiagnosticsTest passed

Task-Guard: P6-2-audio-diagnostics-api-compat
2026-09-05 13:38:00 +08:00
www.xueximeng.com
aed962426d Fix MPV P8.1 HDR10 hardware fallback
Verification: 用户确认手机实测 P8.1 HDR10 回退播放正常;双 ABI native assets ELF 校验通过;Mobile Arm64 Debug APK 构建成功

Task-Guard: P6-1-mpv-p81-hdr10-fallback
2026-09-05 13:34:37 +08:00
Silent1566
727e4d640e
Merge pull request #213 from Silent1566/dev2
合并远端beta分支最新代码
2026-09-05 13:08:48 +08:00
Silent1566
1a41a6f0ae Merge remote-tracking branch 'origin/beta' into dev3 2026-09-05 12:57:03 +08:00
Silent1566
6831f897a8 Merge remote-tracking branch 'origin/beta' into dev2 2026-09-05 12:42:48 +08:00
Silent1566
78b36585ef feat: move touch optimization to personal settings (TV & mobile)
Verification: Tests pass: TouchOptimizationHelperSourceTest (leanbackArm64_v8aDebug); resources compile: processMobileArm64_v8aDebugResources + compileMobileArm64_v8aDebugJavaWithJavac; mobile drawable reference changed to color selector_item; removed stray selector_item.xml

Task-Guard: move-touch-optimization-personal
2026-09-05 12:15:32 +08:00
Silent1566
36b04d1a51 feat: 实现弹幕手动匹配记忆功能(站点级和TMDB全局级) 2026-09-05 12:04:56 +08:00
Silent1566
23ee0d628b feat: add playback menu overlay switch
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests *SettingPlaybackOverlayTest* (BUILD SUCCESSFUL)

Task-Guard: ui_playback_overlay_switch
2026-09-05 11:55:42 +08:00
Silent1566
83176f4d2a Merge remote-tracking branch 'origin/beta' into dev1 2026-09-05 11:44:40 +08:00
Silent1566
97a7dd8898 feat: remember manual danmaku search intent
Verification: Gradle :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.bean.DanmakuMatchCacheTest --tests com.fongmi.android.tv.api.DanmakuApiSourceTest passed; :app:compileLeanbackArm64_v8aDebugJavaWithJavac passed

Task-Guard: danmaku-manual-match-memory
2026-09-05 11:10:17 +08:00
Silent1566
d84d54bf98
Merge pull request #212 from Silent1566/dev1
合并 dev1 到 beta:外挂字幕恢复与同步修复
2026-09-05 10:26:10 +08:00
Silent1566
868e1a9020 Revert incorrect test assertion in TmdbDetailActivityLayoutTest
Verification: Test passes

Task-Guard: fix-test-detail-activity-layout-test
2026-09-05 10:24:55 +08:00
Silent1566
8de6306d72 fix: 完善历史外挂字幕恢复
Verification: leanback arm64 debug subtitle unit tests passed; mobile arm64 debug Java compile passed; git diff --check passed

Task-Guard: beta-sync-subtitle-fix-20260905
2026-09-05 09:58:23 +08:00
Silent1566
b395ae5239 Merge remote-tracking branch 'origin/beta' into dev1 2026-09-05 09:47:01 +08:00
Silent1566
317490478f ui: move touch optimization below personal settings
Verification: TouchOptimizationHelperSourceTest passed; XML DOM verifies touchOptimization immediately follows personal settings row; Gradle BUILD SUCCESSFUL in 58s

Task-Guard: touch-optimization-setting-order
2026-09-05 00:48:41 +08:00
Silent1566
eab79fba92
Merge pull request #211 from Silent1566/release/v5.6.0-beta-202609041027
release: v5.6.0-beta-202609041027
2026-09-05 00:12:39 +08:00
www.xueximeng.com
e5dd86b344 fix(exo): support APE demux and FFmpeg playback
Verification: nextlib r3 dual-ABI build with ape decoder/demuxer; ApeExtractorTest 3/3 passed; app compile and arm64 debug APK build passed; Vivo V2453A install/launch and APE playback confirmed

Task-Guard: E13-EXO-APE
2026-09-04 23:55:02 +08:00
Silent1566
ad702b041f feat: add leanback touch optimization mode
Verification: TouchOptimizationHelperSourceTest 7/7; BackupPreferenceFilterTest 9/9; compileMobileArm64_v8aDebugJavaWithJavac passed; assembleLeanbackArmeabi_v7aDebug passed; APK installed on emulator-5554 and emulator preferences restored

Task-Guard: touch-optimization
2026-09-04 23:08:26 +08:00
Silent1566
6047267856
Merge pull request #210 from Silent1566/dev4
Dev4
2026-09-04 22:51:52 +08:00
Silent1566
af03396e74 Merge remote-tracking branch 'origin/beta' into dev4 2026-09-04 22:16:06 +08:00
Silent1566
2d8f7aeabd Merge remote-tracking branch 'origin/beta' into dev1 2026-09-04 21:35:51 +08:00
Silent1566
5166da98b1 feat: restore external subtitle from playback history
Task-Guard: SUB-EXT-HISTORY-IMPL

Verification: compileMobile+compileLeanback PASS; 18 new unit tests PASS on both variants; full mobile suite 4139 tests with 3 pre-existing failures verified on clean HEAD worktree

Task-Guard: SUB-EXT-HISTORY-IMPL
2026-09-04 20:55:50 +08:00
Silent1566
eb4e334c4f docs: design external subtitle restore from history
Task-Guard: SUB-EXT-HISTORY

Verification: design document only; no code changes in this unit

Task-Guard: SUB-EXT-HISTORY
2026-09-04 19:24:35 +08:00
Silent1566
2b2b136896
Merge pull request #209 from Silent1566/dev3
合并 beta 最新代码并修复评审发现的六处缺陷
2026-09-04 19:15:26 +08:00
Silent1566
43c173d9f2 feat: show TV search source progress
Verification: compileLeanbackArmeabi_v7aDebugJavaWithJavac passed; resource merge/package remains blocked by preexisting protected activity_search.xml.bak files

Task-Guard: TV-SEARCH-PROGRESS
2026-09-04 18:21:39 +08:00
Silent1566
1aa8c0b902 merge: 合并远端beta最新代码并修复评审发现的六处缺陷
合并 origin/beta@a90be6678a 到 dev3,自动合并零冲突。本地两个未推送提交
(详情缓存三道挡板)完整保留,beta 未触及 SiteApi/CatWebEvent/CatAction/VodDetailCache。

评审后修复六处:

1. adapter_github_proxy.xml(mobile)移除 beta 引入的 android:focusable,
   手机端加速源列表恢复首次点击即生效
2. Setting.migrateLegacyGithubProxy 去掉覆盖行,不再把刚合并出的多源列表抹成一条;
   用户原选中地址置于首位成为生效源
3. 同方法改为 synchronized,消除两个 getter 并发进入导致的丢写窗口
4. Backup.isAppPref 恢复三个 update_github_proxy* 旧键,它们是迁移的输入,
   剔掉会让旧版备份恢复后代理选择被丢弃而非迁移(同步改回测试断言)
5. IntroSkipPlayback.id 保留 provider 维度,避免跨 provider 归一后两家片尾
   共享 skipped 状态、导致真正的片尾被永久吞掉(新增测试钉住)
6. UpdateSettingsDialog 焦点在 GitHub 标签下分流到保存按钮/标签条,
   不再 requestFocus 已 GONE 的 ociMirror 造成电视遥控死路

Verification: compileMobile/LeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL;
testMobileArm64_v8aDebugUnitTest 4124项2失败、testLeanbackArm64_v8aDebugUnitTest
3311项2失败,均仅剩已知 C10 FfmpegVc1SupportTest(见 docs/pull-merge-beta-20260904.md);
合并引入的 AboutDialogLayoutTest 失败已消除;git diff --check 通过;
无冲突标记、无悬空资源/类引用、新增字符串三语齐全

Task-Guard: C11-beta-sync
2026-09-04 17:58:51 +08:00
www.xueximeng.com
047ad74f76 docs: close C4 implementation record 2026-09-04 16:01:21 +08:00
www.xueximeng.com
0a31951e3c common: unify audio diagnostics contract
Verification: AudioPlaybackDiagnosticsTest ExoPlaybackDiagnosticsTest MpvDirectAudioPolicyTest passed; compileMobileArm64_v8aDebugJavaWithJavac passed; git diff --check passed; upstream checkpoint verification passed

Task-Guard: C4
2026-09-04 15:55:51 +08:00
Silent1566
9fc6ca2457 fix: 只有占位线路的详情不写缓存,修复设置类入口第二次点击直奔播放页
Verification: 设备实测 NOH-AN00 com.silent.android.webhtv1:连点 spider_json_local 三次 + spider_json_url 一次,每次都调到 spider(detail 响应可见)且都记 detail-cache skip reason=noMetadata,无一次 hit,不再直奔播放页;gradlew :app:testMobileArm64_v8aDebugUnitTest 定向 CatWebWiringTest/CatActionTest/VodDetailCacheTest 通过

Task-Guard: catweb-nometa
2026-09-04 15:12:58 +08:00
www.xueximeng.com
43fba18a8d docs: close C4 audio policy assessment record
Verification: git diff --check; task_guard check; C4 commit/tag closure record present

Task-Guard: C4
2026-09-04 14:51:56 +08:00
Silent1566
a90be6678a
Merge pull request #208 from Silent1566/dev1
合并远端beta分支最新代码并审查修改
2026-09-04 14:51:02 +08:00
www.xueximeng.com
ebb5285238 docs: define common audio policy contract
Verification: git diff --check; task_guard check; documentation references and C4 scope validated

Task-Guard: C4
2026-09-04 14:48:59 +08:00
Silent1566
34a1647bcd Merge remote-tracking branch 'origin/beta' into dev1 for review 2026-09-04 14:27:21 +08:00
www.xueximeng.com
80e3138308 fix(exo): extract ALAC cookie from QuickTime wave atoms
Verification: Media3 extractor patch apply-check passed; lib-extractor publication succeeded; APK app-mobile-arm64_v8a-debug built with refreshed extractor (SHA-256 f07d53392be6b0aa373a240d2cdec91b358e512a57bbfd3af32595e80cadd4d9); device accepted installation and user confirmed ALAC playback appears working

Task-Guard: E12
2026-09-04 14:05:55 +08:00
Silent1566
a7d3974593 fix: restore github proxy dialog list height
Verification: gradlew :app:compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL after layout_height fix

Task-Guard: github-proxy-dialog-crash-fix
2026-09-04 13:59:21 +08:00
Silent1566
e6429d1078 fix: expand github proxy dialog content
Verification: gradlew :app:compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL

Task-Guard: github-proxy-dialog-content-height
2026-09-04 13:20:44 +08:00
Silent1566
5a1e4f0f76 fix: 开过设置网页的详情不写缓存,修复二级页面只有第一次点击生效
Verification: gradlew :app:testLeanbackArm64_v8aDebugUnitTest 通过(CatWebWiringTest/CatActionTest/VodDetailCacheTest 定向 + 全量 3278 项,仅 FfmpegVc1SupportTest 2 项在干净树上同样失败,与本改动无关)

Task-Guard: catweb-reclick
2026-09-04 13:14:18 +08:00
www.xueximeng.com
04904ff99a fix(exo): route ALAC away from stalled vendor decoder
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.player.exo.ExoAudioCodecSelectorTest --tests io.github.anilbeesetti.nextlib.media3ext.ffdecoder.CompatFfmpegAudioRendererTest passed; device log /private/tmp/exo-alac20-initdiag2.log reproduced missing initializationData

Task-Guard: E12
2026-09-04 13:04:55 +08:00
Silent1566
63e0c71e04 Merge remote-tracking branch 'origin/beta' into dev4 2026-09-04 12:53:18 +08:00
Silent1566
068e875bd6
Merge pull request #207 from Silent1566/dev4
Dev4
2026-09-04 12:47:45 +08:00
Silent1566
5883f2d94e Merge branches 'main' and 'dev4' of https://github.com/Silent1566/webhtv into dev4 2026-09-04 12:45:20 +08:00
Silent1566
6d8e97763c fix: improve github proxy dialog touch layout
Verification: gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.utils.GithubProxyTest BUILD SUCCESSFUL

Task-Guard: github-proxy-dialog-fix
2026-09-04 12:44:20 +08:00
Silent1566
938220a471 Hide empty search sources
Verification: SearchSourceVisibilityTest passed 4/4 on leanback and mobile; FfmpegVc1SupportTest failures are pre-existing and out of scope

Task-Guard: SEARCH-EMPTY-SOURCE-HIDE
2026-09-04 11:36:03 +08:00
Silent1566
55a6ed3531 feat: merge legacy github proxies and probe latency
Verification: gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.utils.GithubProxyTest BUILD SUCCESSFUL

Task-Guard: github-proxy-merge-latency
2026-09-04 11:29:36 +08:00
Silent1566
a6f66b9c44 test: make reader history refresh assertion CRLF tolerant
Verification: testMobileArm64_v8aDebugUnitTest targeted run: 28 tests, 25 Reader tests passed; two pre-existing C10 FfmpegVc1SupportTest wvc1 failures remain; git diff --check passed

Task-Guard: pull-merge-beta-20260904
2026-09-04 11:09:16 +08:00
Silent1566
7d18c03048 feat: unify github proxy configuration
Verification: gradlew :app:testMobileArm64_v8aDebugUnitTest focused GithubProxyTest BackupPreferenceFilterTest UpdateRoutePlannerTest BUILD SUCCESSFUL

Task-Guard: github-proxy-unification
2026-09-04 10:41:33 +08:00
Silent1566
fbbefb75db
Merge pull request #206 from Silent1566/dev4
Dev4
2026-09-04 10:27:22 +08:00
Silent1566
dd105e8969
Merge pull request #205 from Silent1566/dev2
Dev2
2026-09-04 10:26:51 +08:00
www.xueximeng.com
56b802ef58 docs: add audio and multichannel strategy assessment
Verification: git diff --check passed; target Markdown exists and contains 139 lines after trailing-whitespace fix

Task-Guard: audio-policy-assessment-doc
2026-09-04 10:26:06 +08:00
www.xueximeng.com
c826ee327b fix(exo): support AV3A 5.1 mixed-content channel downmix
Verification: Vivo V2453A real-device ADB playback confirmed for Exo AV3A 5.1 CMAF, DASH, and TS; user reports no issue

Task-Guard: E12
2026-09-04 10:13:57 +08:00
Silent1566
5db6efaef9 docs: record C10 beta alignment review
Verification: beta merge tree preserves C10 upstream player parity and prior verification; no new code changes beyond C10 documentation checkpoint

Task-Guard: C10-beta-sync-closure
2026-09-04 10:10:28 +08:00
Silent1566
3df618f1cc merge: sync origin/beta C10 and resolve intro skip conflicts
Verification: MobileArm64 targeted unit tests: IntroSkipServiceTest, VideoActivityLayoutTest, ExoUtilTest passed; compileLeanbackArm64_v8aDebugJavaWithJavac passed; git diff --check and conflict-marker scan passed

Task-Guard: C10-beta-conflict-resolution
2026-09-04 10:09:46 +08:00
Silent1566
902decfcf0 merge beta E-SP7 adaptive selection 2026-09-04 10:02:40 +08:00
Silent1566
d35797e8ee chore(player): remove stale mpv v556 inputs
Verification: C10 v556 cleanup: upstream native override parity, dead-reference check, and dual-ABI MPV ELF gate passed

Task-Guard: C10-v556-input-cleanup
2026-09-04 09:50:59 +08:00
www.xueximeng.com
639a046125 fix(exo): parse AVS3A DASH channel configuration
Verification: clean Media3 patch apply check; DASH parser Java compile and AAR publication passed; App ARM64 Java compile and APK assemble passed; Robolectric test blocked by host DefaultSdkProvider; ADB device unavailable for playback

Task-Guard: E12
2026-09-04 02:07:50 +08:00
Silent1566
602203b7f3 docs: close C8 beta sync record
Verification: C8 repair commit and recovery tag pushed; 73 targeted tests pass; Mobile and Leanback Arm64 Java compilation passes; git pull --ff-only up-to-date

Task-Guard: C8-beta-sync
2026-09-04 00:12:46 +08:00
Silent1566
1d08c6fba2 merge: sync origin/beta C8 and close review repairs
Verification: Mobile/Leanback Arm64 Java compile and focused Mobile Arm64 tests: BUILD SUCCESSFUL; 73 tests, 0 failures, 0 errors, 0 skips; git diff check passed

Task-Guard: C8-beta-sync
2026-09-04 00:07:41 +08:00
www.xueximeng.com
2f2f99fb7d fix(mpv): downmix unknown AV3A channels to stereo
Verification: Dual-ABI native build and ELF asset verification passed; Mobile arm64 APK 799ec48f0681db69c97863b1bc8a2d974aded4b4959011a3804ccdcf7ad45865 installed on vivo V2453A serial 10CF6H1D2L0009S; user confirmed AV3A 5.1 playback is audible; conservative equal-gain downmix volume note recorded

Task-Guard: P3-7
2026-09-03 22:04:14 +08:00
Silent1566
08a0911f85 docs: close C10 binary upstream alignment record
Verification: C10 implementation commit 79597d2c68 and recovery tag recorded; binary alignment and validation already completed.

Task-Guard: C10-binary-upstream-align-closure
2026-09-03 19:41:21 +08:00
Silent1566
79597d2c68 build(player): align binary dependency inputs with upstream
Verification: C10 selected Media3/Nextlib/lock/patch inputs match upstream/main ec478b0b69; JSON and 13 patch references valid; MPV arm64-v8a/armeabi-v7a ELF asset gate passed with NDK 28.2.13676358; Mobile Java compile BUILD SUCCESSFUL in 2m 3s; Leanback Java compile BUILD SUCCESSFUL in 1m 39s; checkpoint and diff checks passed

Task-Guard: C10-binary-upstream-align
2026-09-03 19:13:34 +08:00
www.xueximeng.com
69191f78a3 fix(mpv): recover AAC playback through PCM fallback
Verification: 用户已确认 MPV AAC 三个样本在 vivo V2453A 上播放正常(AAC_LC_2.0_48kHz.mp4、AAC_HE_V1_2.0_44.1kHz.aac、AAC_HE_V2_2.0_44.1kHz.aac);压缩输出失败后的 PCM 回退及切换场景已接受

Task-Guard: P3-5
2026-09-03 18:12:39 +08:00
Silent1566
5cf2f2e7fd Resolve merge conflicts for C8-beta-sync task 2026-09-03 17:27:32 +08:00
Silent1566
bb53d224e0
Merge pull request #204 from Silent1566/dev4
Dev4
2026-09-03 15:38:27 +08:00
Silent1566
80ded1386a docs: update C9 beta ledger and E-SP7 beta merge checkpoint; record test results
Verification: E-SP7 and beta affected tests passed; C9 doc updated with latest beta ledger and checkpoint; no new playback regression detected.

Task-Guard: C9-beta-sync
2026-09-03 15:24:02 +08:00
Silent1566
288984e966 fix: restore update acceleration source selection from settings 2026-09-03 14:52:06 +08:00
Silent1566
ff438637b8 docs: record playback diff audit checkpoint
Verification: Checkpoint 57: static playback diff audit recorded; no device A/B run

Task-Guard: PLAYBACK-DIFF-AUDIT-20260903
2026-09-03 13:55:08 +08:00
Silent1566
bcfe7b22a0
Merge pull request #203 from Silent1566/dev1
Dev1
2026-09-03 13:20:56 +08:00
Silent1566
0c62583d4d Merge remote-tracking branch 'origin/beta' into dev1 2026-09-03 13:09:35 +08:00
Silent1566
9b2f02bd30
Merge pull request #202 from Silent1566/dev3
Dev3
2026-09-03 12:48:10 +08:00
Silent1566
97e980c8bd feat: complete beta sync review and fixes
Verification: IntroSkipServiceTest passed

Task-Guard: review-beta-sync-20260903
2026-09-03 11:45:01 +08:00
Silent1566
0c71cad175 fix: release stuck TV speed boost overlay when key release is missed
Verification: :app:testMobileArm64_v8aDebugUnitTest VideoActivityLayoutTest.playbackSpeedInitializationUsesPersonalDefaultSpeed and VideoActivityLayoutTest.leanbackSpeedBoostReleaseIsGuarded BUILD SUCCESSFUL; :app:compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean

Task-Guard: speed-logo-release
2026-09-03 11:26:15 +08:00
Silent1566
a228e988d4 fix(exo): restore adaptive AVC track selection
Verification: ExoUtilTest: BUILD SUCCESSFUL in 58s (16 tests); compileMobileArm64_v8aDebugJavaWithJavac: BUILD SUCCESSFUL in 57s; compileLeanbackArm64_v8aDebugJavaWithJavac: BUILD SUCCESSFUL in 2m 5s; git diff --check and scoped guard check passed

Task-Guard: E-SP7
2026-09-03 08:54:20 +08:00
www.xueximeng.com
8419003c2f Fix MPV compressed audio output fallback
Verification: MPV native dual-ABI build passed; verify_mpv_native_assets.sh --require-elf passed for arm64-v8a and armeabi-v7a; assembleMobileArm64_v8aDebug passed; device ADB endpoint unavailable so runtime AAC/ALAC/AV3A/MP3 playback and installation remain pending

Task-Guard: P3-5
2026-09-03 02:31:34 +08:00
Silent1566
c0192b6c71 fix: expand mobile backdrop episode scroll content
Verification: emulator-5554 runtime: current APK in detail_open_mode=5 has episode content bounds [0,184][1920,1391], tmdbCastLabel begins at 1847, and outer FixedNestedScrollView consumes vertical swipes; no FATAL EXCEPTION or ANR. Final focused tests: ./gradlew.bat :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.VideoActivityLayoutTest.mobileVideoEpisodeViewportKeepsItsCapUnlessThePageOwnsTmdbEpisodeScroll --tests com.fongmi.android.tv.ui.activity.VideoActivityLayoutTest.mobileOriginalEnhancedEpisodeViewportUsesOuterPageScrollWithoutHeightCap --tests com.fongmi.android.tv.ui.activity.VideoActivityLayoutTest.mobileBackdropTmdbEpisodeGridLetsTheOuterScrollContentGrowAfterReparenting --no-daemon --console=plain; Gradle exit=0; BUILD SUCCESSFUL. git diff --check passed.

Task-Guard: mobile-backdrop-episode-outer-scroll
2026-09-03 00:43:45 +08:00
Silent1566
308694aaad
Merge pull request #201 from Silent1566/dev4
收紧更新签名校验容错边界
2026-09-03 00:07:23 +08:00
Silent1566
b235cee740 fix: isolate and harden reader history routing
Verification: Gradle :app:testMobileArm64_v8aDebugUnitTest passed ReaderHistoryProgressTest ReaderPlaybackRoutingSourceTest HistoryResumeCoordinatorTest

Task-Guard: reader-history-resume-fix
2026-09-03 00:06:57 +08:00
Silent1566
59fd2688f7 收紧更新签名校验容错边界
Verification: Gradle :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.UpdaterFutureTest BUILD SUCCESSFUL

Task-Guard: beta-sync-review-20260902-fix
2026-09-02 23:57:55 +08:00
Silent1566
c493488de4 Merge remote-tracking branch 'origin/beta' into dev4 2026-09-02 23:36:56 +08:00
www.xueximeng.com
c7d43205f9 fix Exo compressed audio PCM channel fallback
Verification: CompatFfmpegAudioRendererTest passed; Mobile ARM64 Java compile passed; PCM channel-mask probe selects decoder-side stereo fallback for unsupported multichannel routes

Task-Guard: E12-3
2026-09-02 23:01:10 +08:00
www.xueximeng.com
12ebbf8d15 fix Exo audio output configuration recovery
Verification: ExoCompressedAudioDirectPolicyTest passed; Mobile ARM64 Java compile passed; runtime AudioTrack configuration failures now map to Media3 audio init errors

Task-Guard: E12-2
2026-09-02 22:55:49 +08:00
Silent1566
fddca6e60d fix: tolerate unreadable APK signing info during update validation 2026-09-02 22:45:27 +08:00
www.xueximeng.com
53eab9c2d6 mpv: expose AV3A audio tracks with canonical MIME
Verification: AV3A/MP3 MIME mapper unit tests and mobile ARM64 Java compile passed; fixture metadata confirmed; no native lock changes

Task-Guard: P3-6-MPV-AUDIO-CODEC-COMPAT
2026-09-02 22:06:08 +08:00
www.xueximeng.com
5c104a199f exo: route MP4 AV3A tracks to compatible decoder
Verification: Media3 AV3A patch check; retained common/container/extractor AAR/source SHA-256 lock updates; focused mobile ARM64 unit tests and Java compile passed

Task-Guard: E12-1-EXO-AUDIO-CODEC-COMPAT
2026-09-02 21:53:36 +08:00
www.xueximeng.com
347801b81f docs: record Exo audio codec compatibility investigation
Verification: E12 research record added; test-library metadata, locked AAR symbols, nextlib 323340522 channel-layout fix, and missing Media3 MP4 AV3A branch documented

Task-Guard: E12-EXO-AUDIO-CODEC-COMPAT
2026-09-02 20:42:23 +08:00
Silent1566
e7c1c9cccc
Merge pull request #200 from Silent1566/dev4
Dev4
2026-09-02 20:20:32 +08:00
www.xueximeng.com
d00aa57379 mpv: repair compressed AudioTrack fallback patch hunks
Verification: mpv compressed AudioTrack patch apply-check --recount passed for all files; arm64-v8a prepare-only completed successfully; git diff --check passed

Task-Guard: P3-5-aac-compressed-fallback
2026-09-02 20:16:21 +08:00
Silent1566
db7218f51f 合并远端beta最新代码并解决冲突
Verification: merge-related-tests-passed

Task-Guard: beta-merge-conflict-20260902
2026-09-02 20:16:16 +08:00
www.xueximeng.com
37888d8b9d exo: gate network protection on actual audio output
Verification: bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.player.exo.ExoNetworkGuardEligibilityTest --no-daemon (BUILD SUCCESSFUL); git diff --check passed; runtime PCM/OFFLOAD eligibility tests passed

Task-Guard: EXO-NETWORK-AUDIO-RUNTIME
2026-09-02 19:05:56 +08:00
Silent1566
624e0b16a3 修复合并评审发现的播放器遮罩与预载回归
Verification:  :app:testLeanbackArm64_v8aDebugUnitTest + :app:testMobileArm64_v8aDebugUnitTest focused playback regression suites passed

Task-Guard: beta-merge-review-fixes-20260902
2026-09-02 18:45:48 +08:00
www.xueximeng.com
cb0a59f819 mpv: report actual hardware audio decoder state
Verification: bash scripts/verify_mpv_native_assets.sh --require-elf; bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.player.AudioPlaybackDiagnosticsTest --no-daemon (BUILD SUCCESSFUL); compileMobileArm64_v8aDebugJavaWithJavac passed; git diff --check passed

Task-Guard: P3-5
2026-09-02 18:29:16 +08:00
Silent1566
cf89d14358 docs-close-C7-beta-sync
Verification: C7-doc-closure-a8f2015363819c70b4e7ae67d419035e579b857f

Task-Guard: C7-beta-sync
2026-09-02 18:16:10 +08:00
Silent1566
a8f2015363 merge-C7-beta-sync
Verification: C7-beta-sync-7db1b9d-gradle-pass

Task-Guard: C7-beta-sync
2026-09-02 18:10:48 +08:00
www.xueximeng.com
734e99253e mpv: add compressed AudioTrack output path
Verification: AudioPlaybackDiagnosticsTest passed; verify_mpv_native_assets.sh --require-elf passed for arm64-v8a and armeabi-v7a; arm64 native assets contain raw compressed AudioTrack markers

Task-Guard: P3-5
2026-09-02 18:10:37 +08:00
Silent1566
7db1b9d188
Merge pull request #199 from Silent1566/dev2
Dev2
2026-09-02 17:37:06 +08:00
Silent1566
1b376ee046 docs: close C6 beta sync record
Verification: C6 code commit a33ff92b8e and recovery tag recovery/C6-beta-sync/20260902090623-a33ff92b8e65 are pushed; 171 targeted tests pass; Mobile and Leanback Java compilation pass; git pull --ff-only up-to-date

Task-Guard: C6-beta-sync
2026-09-02 17:29:26 +08:00
Silent1566
a33ff92b8e merge: sync origin/beta C6 and fix subtitle callback race
Verification: JUnit 171 tests pass: TrackDialogTest 10, VideoActivityLayoutTest 150, RealtimeSubtitleModelCatalogTest 5, RealtimeSubtitleTranslatorTest 6; Mobile and Leanback Arm64 Java compilation BUILD SUCCESSFUL; git diff check and conflict scan pass; review findings fixed

Task-Guard: C6-beta-sync
2026-09-02 17:06:23 +08:00
Silent1566
671888a556 Merge remote-tracking branch 'origin/beta' into dev4 2026-09-02 17:02:11 +08:00
Silent1566
ddb9045561 "fix: expand original enhanced episode page scroll content"
Verification: "./gradlew.bat :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.VideoActivityLayoutTest.mobileOriginalEnhancedEpisodeGridLetsTheOuterScrollContentGrowAfterReparenting --tests com.fongmi.android.tv.ui.activity.VideoActivityLayoutTest.mobileOriginalEnhancedEpisodeViewportUsesOuterPageScrollWithoutHeightCap --tests com.fongmi.android.tv.ui.activity.VideoActivityLayoutTest.mobileVideoEpisodeViewportUsesStableCapInsideScrollPage --tests com.fongmi.android.tv.ui.activity.VideoActivityLayoutTest.mobileVideoEpisodeViewportUsesStableCapInsideScrollPage --no-daemon --console=plain; BUILD SUCCESSFUL; JUnit tests=3 failures=0 errors=0 skipped=0; all focused cases PASS"

Task-Guard: mobile-original-enhanced-scroll-content-height
2026-09-02 16:30:11 +08:00
Silent1566
1c1ab72ec8 fix: release mobile original enhanced episode viewport height
Verification: Targeted :app:testMobileArm64_v8aDebugUnitTest --tests VideoActivityLayoutTest.mobileOriginalEnhancedEpisodeViewportUsesOuterPageScrollWithoutHeightCap --tests VideoActivityLayoutTest.mobileVideoEpisodeViewportUsesStableCapInsideScrollPage passed (Gradle exit=0); git diff --check passed. Full VideoActivityLayoutTest class also compiled but has unrelated pre-existing failure mobilePlayerKernelClickOpensChooserBeforeSwitching.

Task-Guard: mobile-original-enhanced-episode-height
2026-09-02 13:48:22 +08:00
Silent1566
9188c8a6a1
Merge pull request #198 from Silent1566/dev3
修复:手动选择 TMDB 后重进详情页丢失手动选择
2026-09-02 12:20:27 +08:00
Silent1566
b7b2b1a6c9 feat:quick-switch-realtime-subtitle-language
Verification: targeted-subtitle-tests-and-leanback-compile-BUILD-SUCCESSFUL

Task-Guard: realtime-subtitle-language-quick-switch
2026-09-02 11:12:25 +08:00
Silent1566
adbc991385 修复:手动 TMDB 别名污染与全局标题域降级
三处评审自查发现的缺陷:

- 别名列表把已富集的 vod.getName() 也写成精确键。applyLoaded 里
  sourceVodName 取的是真源标题,但此时 vod.getName() 已被上一轮 enrichVod
  改写成"上一个" TMDB 标题。A→B→C 连续手动切换后,key(标题A) 仍指向条目 B
  且不会被 C 的写入覆盖。详情页读不到(用的是源标题或 Intent 名),但历史
  记录长期持久化 vodName,History.resolveTmdbIdentity 拿 titleA 反查就会
  读回旧选择,导致历史聚合归错条目。详情页改为仅在 sourceVodName 为空时
  才纳入 vod.getName();适配器侧用当前已加载条目的标题判断它是否已被改写。
- putManual 完全不写全局标题域,导致自动匹配留在标题域里的旧猜测在用户纠正
  后依然被别的站源沿用。改为照旧维护,并在 putTitle 中让手动结论优先于自动
  猜测:手动可覆盖自动、自动不得覆盖手动,仅两者都是手动且指向不同条目时才
  标冲突(原实现会直接降级成 conflict,使所有站源都读不到)。
- findManualEntry 在空 sourceTitle 时会落到锚点标题校验而必然失败。空标题
  出现在首次进场且 Intent 未带 name(历史/推送入口),此时手动选择读不回。
  改为空标题沿用条目级语义,与两参 find(siteKey, vodId) 一致。

补充三个用例锁定:无可用别名时锚点不得成为通配符、空标题仍可读回、手动结论
在全局标题域中压过自动猜测且不被其冲掉。
2026-09-02 10:02:14 +08:00
www.xueximeng.com
d8a994af5a player: align audio decode labels with video diagnostics
Verification: AudioPlaybackDiagnosticsTest passed; git diff --check; task guard scope check passed

Task-Guard: P3-5
2026-09-02 08:08:05 +08:00
www.xueximeng.com
3fdf9f82f3 exo: recover compressed audio output failures with PCM fallback
Verification: focused unit test, arm64 debug build, V2453A MP3/AAC cold-start automatic PCM fallback and AAC 5.1 PCM evidence

Task-Guard: E11
2026-09-02 07:21:17 +08:00
Silent1566
381266a579 按第二轮评审修跳过判定的状态机与去重
第二轮评审指出上一轮的修法引入或遗留了以下问题,逐条修:

判定状态机:把「此刻不适用」和「本集已决定」分开。isKindEnabled、
时长未知、位置未到都只跳过本轮,不再写 skipped——写了就会让中途打开
某一类、时长从 0 变真值、往回拖进度这些情形整集失效(勾选全不选时
更是让整个功能静默失效)。

落点与看完拆成两件事:seekTarget 只回答「往前跳到哪」,endsWithFile
单独判断「是否一路到文件结束」。早先两者共用 -1,确认片头时若已播过
片头末尾就会被当成本集看完直接切到下一集。

确认框:改为在点确认的瞬间按当前位置重算落点,并校验 generation 与
isReleased——旧实现沿用检测时的落点,用户延迟确认会往回 seek,跨集
确认会拿上一集的段落动作把人带到别处。同时补 dismiss:换集/换源时
收掉还挂着的确认框,否则它会一直占住 isShowing 让新一集永远不弹。

resumeMs 从「整场有效」改为「落点到达即清零」,之前续播一次就会把
其后所有段落和两个控制栏标签一起锁死。

去重:无界段(片尾无 end_ms 被拉到文件结尾)不再用结束点算重叠,
只比起点,否则片尾会把紧随其后的预告整段吞掉;同段取舍改为有界优先
于分数,避免高分的无界段挤掉另一家给出的确切结束点,把彩蛋一起丢掉。

openEnded 只在有参考时长时判定。IntroDB 从不给参考时长,拿本集时长
去比参考时间轴上的 end 是跨时间轴比较,会把「片尾后还有内容」误判成
「一直到结尾」,跳过因此变成切集。

基准时长校验从 0.5x–2x 收紧为绝对差 5 分钟以内,并改用减法比较避免
乘法溢出;近 2 倍的错配之前能通过,随后按几分钟的平移把落点算进正片。

失败不再进缓存。键里没有时长也没有 TTL,超时/报错时缓存空表等于把
这一集永久标记成无数据,且预载会把这种结果提前种到用户即将播的集上。
仅 404 视为确定的「没有数据」。

其他:TmdbDetailActivity 补上邻集预热(此前只有另两个播放页有);
长按清空片头/片尾后不再立刻渲染探测值,否则看起来像没清掉;
integer() 改为夹取,避免超出 int 范围时绕回小值改变去重排序;
SettingAdFragment 的 getActivity() 改为 requireActivity()。

新增 3 组用例:无界片尾不吞预告、有界优先于无界、无参考时长时按有界
处理。IntroSkipServiceTest 20 项全通过。
2026-09-02 00:31:58 +08:00
Silent1566
b0af66ac56 修复:手动 TMDB 绑定的通配符退化与丢失更新竞态
评审自查发现两处会让上一提交的修复失效的缺陷:

- matchesManualTitle 在别名列表为空(非 null)时也放行。Entry.manual()
  会初始化空列表,若所有别名经 cleanTitle 后都成空串(如站源标题只剩
  年份或纯符号),条目级锚点就退化成通配符,把同一 vodId 下的其他作品
  也匹配成这次手动选择——正是 titleScopedCacheSeparatesSameSiteAndVodId
  所防的串台。改为仅在别名字段为 null(旧版本数据)时放行。
- Setting.getTmdbMatchCache/putTmdbMatchCache 不是 synchronized(季度
  缓存版本是),而 saveMatch 在后台线程、saveManualMatch 在主线程,
  读-改-写非原子:后到的自动结果基于旧快照写回会覆盖刚落盘的手动选择,
  等于让修复被竞态绕过。两个访问器加 synchronized,四处读-改-写包进
  synchronized (Setting.class),与季度缓存使用同一锁对象。

补充用例锁定锚点在无可用别名时不得变成通配符。
2026-09-02 00:30:25 +08:00
Silent1566
d5182a794e Merge remote-tracking branch 'origin/beta' into dev3 2026-09-01 22:43:47 +08:00
Silent1566
5a8122f8f6 修复:手动选择 TMDB 后重进详情页丢失手动选择
TMDB 匹配缓存原本没有"手动"概念:手动选定的条目与自动匹配结果
共用同一槽位、同一格式,于是重进详情页时被两处逻辑联手抹掉——
读取侧 isCachedTmdbMatchCompatible 用"缓存标题 == 清洗后的站源标题"
校验,而手动选择的存在本身就意味着两者不一致,必然判为陈旧缓存丢弃;
随后自动匹配又无条件写回同一 key,永久覆盖用户的选择。季度绑定的 key
含 tmdbId,removeIfMediaChanged 发现 tmdbId 变化后删行,所以季度是被
连带清理的。

- TmdbMatchCache 增加 manual 标记与 putManual/findManual/isManual;
  手动条目按所有已知站源标题别名(详情名、Intent 名、当前 Vod 名、
  TMDB 标题)与条目级锚点写入,标题被富集改写后仍能读回;锚点校验
  别名集合,避免同一 vodId 挂多部作品时串台;自动写入命中手动条目
  时直接跳过。
- 读取侧优先取手动条目,并跳过标题兼容性校验与分季变体过滤。
- TmdbUIAdapter.load 不再清空 sourceCacheTitle 后用已被改写的
  vod.getName() 重算,改为沿用上次捕获的站源标题,使季度绑定键跨会话一致。
- manualBindingFingerprint 改用顺序无关的 stableStructureFingerprint:
  TmdbEpisodeSorter 会在会话中途重排选集,按位置计算的摘要必然前后不同,
  导致季度绑定每次重进都被判为源结构变化而丢弃。
2026-09-01 22:43:18 +08:00
Silent1566
c975ae1ed4
Merge pull request #197 from Silent1566/dev2
Dev2
2026-09-01 22:07:08 +08:00
Silent1566
db4b1650f7 docs: record C5 beta sync closure
Verification: C5 commit fc5b6ba029 and recovery tag recorded

Task-Guard: C5-beta-sync-closure
2026-09-01 22:00:48 +08:00
Silent1566
fc5b6ba029 merge: synchronize beta playback and history fixes
Verification: 83 focused unit tests; Mobile and Leanback Arm64 Java compile; dual ABI MPV ELF asset gate; git diff check

Task-Guard: C5-beta-sync
2026-09-01 21:55:41 +08:00
Silent1566
abe3872a35
Merge pull request #196 from Silent1566/dev3
修复:原生增强详情页不再叠出两层加载中
2026-09-01 20:11:39 +08:00
Silent1566
d187892368 按评审修正跳过逻辑的落点、去重与提示
评审在合并 beta 后指出多处缺陷,逐条修:

- apply() 把落点计算提到可达判定之前,未播到的段会因当前位置算出 -1
  而被写进 skipped,从此永不触发(片头 id 稳定,一整集都失效)。改为
  先判可达、命中时再算落点。
- 段落 id 含时间边界,而尾部段随时长折算平移,时长抖动后同一段换出新 id
  逃出 skipped,重复跳过甚至重复换集。id 改为类型 + 数据源。
- request() 无条件提交 loadedKey 却只在非空时替换 plan,解析层「对不上
  时间轴、应丢弃」的判定会被按 duration=0 算出的旧计划覆盖,把正片中段
  当片尾跳走。改为无条件采纳解析结果。
- 确认模式下先标记 skipped 再回调,被别的弹框挡住时该段永久静默丢失;
  且确认框里用的是检测时算好的落点,用户延迟确认会往回 seek。改为
  监听器返回是否真的弹出、落点在确认瞬间重算。
- 跳过提示与「没有下一集」会同时弹出两条互相矛盾的提示。换集动作改为
  返回是否真的切走,切不动时不提示。
- overlaps() 上一轮限定同类去重,导致两家标注不一致(一家 recap、
  一家 intro)的同一段开头不再合并,会连跳两次。改为按开头/尾部分组,
  组内允许跨类合并。
- cacheKey() 仍带时长档,与「缓存原始段」的设计自相矛盾:预载永远命中
  不了,每集打两轮网络。改为只含剧集身份;随之删除失效的 sameEpisode。
- referenceDuration() 认裸 duration 且不校验量级,TMDB 系用它表示分钟,
  会算出天量偏移静默抹掉所有尾部段。改为只认带单位后缀的键,并要求
  参考时长与本集时长在同一量级,否则放弃折算。
- detectedIntroSkipValue() 只判 player() == null,服务已 release 而
  Activity 仍持有 mService 的窗口里 getDuration() 会 NPE,补 isReleased()。
- 预载未排除 getAdjacentEpisode 越界夹回当前集的情况,首末集会给本集
  重复发一次请求。

新增用例覆盖缓存键、基准量级校验、跨类合并;IntroSkipServiceTest 17 项全通过。
2026-09-01 18:10:02 +08:00
Silent1566
a26a80d0c2 Merge remote-tracking branch 'origin/beta' into dev3 2026-09-01 15:11:47 +08:00
Silent1566
826a4c10be 修复:手机端原生增强进入播放页仍叠两层加载与紫色底屏
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests "*VideoActivityLayoutTest*" tests=149 failures=0 errors=0; :app:compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; new guard test verified failing when the getDetail guard is reverted; runtime behaviour not yet confirmed on device
Task-Guard: mobile-enhanced-shell-backdrop
2026-09-01 15:10:27 +08:00
Silent1566
9e8e029665 Merge remote-tracking branch 'origin/beta' into dev4 2026-09-01 14:21:07 +08:00
Silent1566
d8910cc35a 修复自动跳片尾失效并细分可跳片段类型
片尾一直不跳有四个原因,逐条修:

1. 片尾段被整段丢弃。数据源时间戳按发行版本标定,本地片源常有掐头/删减,
   Segment.create 里 start >= durationMs 一命中就丢,片头因起点接近 0 不受影响,
   片尾必中。改为按「距结尾偏移」折算到本地时间轴,折算后仍对不上才丢弃。
2. 片尾永远走不到 seekTo。片尾多数没给 end_ms,旧代码填成 duration,
   于是 end < duration - 容差 恒为假。新增 isOpenEnded() 显式区分
   「放到文件结束」和「片尾后还有彩蛋/预告」,前者按本集看完处理,后者才 seek。
3. 跳不了集时静默无反应。onEnding 走 checkEnded(false),电影/末集/倒序首集
   一律无提示无动作,且 skipped 已标记不再重试。改为 notify=true。
4. 续播护栏对起点为 0 的片头永久失效。接口对没给 start_ms 的片头填 0,
   旧护栏按起点判断,只要有观看历史即恒成立。改为片头看结束点、片尾看起点。

在此之上按需求细分片段类型与补齐提示:

- 新增 PREVIEW(下集预告),四类片段各自可开关,位掩码存 intro_skip_kinds,
  默认开回顾/片头/片尾。设置页新增「跳过的片段类型」多选框。
- apply() 从片头/片尾两套逻辑合并为按时间顺序逐段判定,四类共用一条通路。
- 去重限定同类之间,避免紧邻的片尾与预告被并成一段。
- 自动跳过后给出提示,区分「已跳过片头」与「片尾已跳过,进入下一集」。
- 控制栏片头/片尾按钮显示探测值(~ 前缀区分手设值),不落库不参与同步;
  跳过已越过的段,避免显示一个不会发生的时间。

缓存与请求:

- 缓存改存未折算的原始段,折算推迟到读取时按当次时长做,同一集换片源可复用。
- 缓存键改为剧集身份 + 1 分钟时长档:秒级抖动不穿透缓存,真换片源不误用。
- duration_ms 有则带、无则省,预载时不因缺时长而放弃。
- 新增邻集预热,播放中预载前后各一集。

顺带修复 TmdbDetailActivity 从未接入确认监听(确认模式下无任何反应),
且其判定用 isAutoSkipIntroOutro 导致确认模式连查询都不发,已与另两个播放页对齐。

未确认:下集预告与参考时长的字段名取自常见拼法,两家文档域名被网络策略拦截,
实测响应中均未出现,需后续以真实数据收敛。
2026-09-01 14:20:28 +08:00
www.xueximeng.com
d41155f16c mpv: prefer hardware audio MediaCodec with fallback
Verification: JVM policy tests and Java compile passed; dual-ABI MPV native rebuild and ELF marker verification passed; Mobile arm64 debug APK asset hashes matched; vivo V2453A AAC playback verified aac_mediacodec failure falls back to FFmpeg PCM without playback failure

Task-Guard: P3-4
2026-09-01 13:09:16 +08:00
Silent1566
ab3093072f 修复:原生增强详情页不再叠出两层加载中
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests "*VideoActivityLayoutTest*" tests=147 failures=0 errors=0 (3 new cases confirmed in XML); :app:compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL
Task-Guard: native-enhanced-single-loading
2026-09-01 11:37:25 +08:00
Silent1566
18b39774a3 记录 C4 上游合并收口
Verification: documented already-verified C4 merge commit d0809f804f and recovery tag recovery/C4/20260901032617-d0809f804f81

Task-Guard: C4-closure
2026-09-01 11:31:50 +08:00
Silent1566
d0809f804f 合并 fish2018/main 上游应用更新
Verification: focused Mobile Arm64 Java/unit suite: 251 tests, 0 failures; MPV native assets --require-elf: both ARM ABIs passed; OCI CI regression assertions and final C4 checkpoint/diff/guard gate passed

Task-Guard: C4
2026-09-01 11:26:16 +08:00
www.xueximeng.com
cf0a5dabc7 feat(exo): prioritize hardware audio decoders
Verification: ExoAudioCodecSelectorTest 3/3 passed; compileMobileArm64_v8aDebugJavaWithJavac passed; git diff --check passed; ADB 192.168.1.9:5555 unavailable

Task-Guard: E10
2026-09-01 06:26:25 +08:00
Silent1566
c1c53da674
Merge pull request #195 from Silent1566/dev4
fix(mpv): restore armv7 DV7 P8.1 native asset
2026-08-31 23:02:32 +08:00
Silent1566
6ccc0de7f0 fix(mpv): restore armv7 DV7 P8.1 native asset
Verification: scripts/verify_mpv_native_assets.sh --require-elf passed for both ARM ABIs with NDK 29 llvm-readelf/llvm-strings; upstream fish2018/webhtv@23a3c74417 armv7 libmpv blob 64701f8a77 and SHA-256 c2b952f9e6d3fb38399672d74bb9a3607668825c6eaacf40d02a1b8706407753 verified

Task-Guard: C2-DV7-P81-BSF-ARMV7-ASSET
2026-08-31 22:49:18 +08:00
Silent1566
76b3fe182b
Merge pull request #194 from Silent1566/dev3
Dev3
2026-08-31 21:37:33 +08:00
Silent1566
701f8ae6fb
Merge pull request #193 from Silent1566/dev4
修复沉浸融合模式播放器当前集标题
2026-08-31 21:37:05 +08:00
Silent1566
b3fab34cab Harden playback ownership and push history keys
Verification: compileMobileArm64_v8aDebugJavaWithJavac + compileLeanbackArm64_v8aDebugJavaWithJavac + focused PlaybackOwnershipSourceTest/HistoryPushKeyStabilityTest/TmdbUIAdapterTest BUILD SUCCESSFUL
Task-Guard: playback-ownership-hardening
2026-08-31 21:35:37 +08:00
Silent1566
119b3aec73 修复沉浸融合模式播放器当前集标题
Verification: :app:testMobileArm64_v8aDebugUnitTest TmdbDetailInlineOsdTitleTest + compileMobileArm64_v8aDebugJavaWithJavac passed

Task-Guard: fusion-inline-osd-episode-title
2026-08-31 21:15:40 +08:00
Silent1566
39ac9634ae Restore playback ownership key after activity recreation
Verification: compileMobileArm64_v8aDebugJavaWithJavac + focused PlaybackOwnershipSourceTest BUILD SUCCESSFUL
Task-Guard: playback-key-restore
2026-08-31 20:38:12 +08:00
Silent1566
0452b2256b Merge remote-tracking branch 'origin/beta' into dev2 2026-08-31 19:55:34 +08:00
Silent1566
b35ff038d2
Merge pull request #192 from Silent1566/dev2
Dev2
2026-08-31 19:32:24 +08:00
Silent1566
51993de7ab
Merge pull request #191 from Silent1566/dev4
修复短剧竖屏手势误触:整屏上下滑切集,亮度音量改为长按后再滑
2026-08-31 19:25:15 +08:00
www.xueximeng.com
37995ff140 Show runtime audio playback diagnostics
Verification: Focused AudioPlaybackDiagnostics, MpvDtsHdFallbackPolicy, and MpvDirectAudioPolicy tests; :app:compileMobileArm64_v8aDebugJavaWithJavac; git diff --check; task_guard check

Task-Guard: P3-3-AUDIO-RUNTIME-DIAGNOSTICS
2026-08-31 19:18:11 +08:00
Silent1566
8a1524335f 修复猫源启动超时与阅读器迟到结果串页
Verification: compileLeanbackArm64_v8aDebugJavaWithJavac,compileLeanbackArm64_v8aDebugUnitTestJavaWithJavac,testLeanbackArm64_v8aDebugUnitTest(NodePortSelectionTest,ReaderPlaybackRoutingSourceTest,VideoActivityLayoutTest) all passed

Task-Guard: sync-beta-review-fixes-20260831
2026-08-31 18:47:36 +08:00
Silent1566
342f99c1ff Fix duplicate TV history projection for unknown season routes
Verification: compileMobileArm64_v8aDebugJavaWithJavac + focused mobile unit tests BUILD SUCCESSFUL; 77 tests, 0 failures
Task-Guard: history-season-snapshot-projection
2026-08-31 18:43:51 +08:00
Silent1566
c45d601fcf Merge remote-tracking branch 'origin/beta' into dev2 2026-08-31 17:58:53 +08:00
Silent1566
86d351d54c 修复短剧竖屏手势误触:整屏上下滑切集,亮度音量改为长按后再滑
用户反馈短剧模式下亮度/音量容易误触。原来的轴向是「中间竖滑切集 +
左右 1/4 竖滑调亮度音量」,在铺满屏幕的竖屏短剧里两者互相干扰:想切集
却滑到了边缘,想调亮度又常常切了集。

参考红果短剧、抖音等主流竖屏播放器改为:
- 上下滑切上下集,不再受左右 1/4 分区限制(24dp 边框仍让给系统手势)
- 亮度/音量改为长按后再上下滑,左半亮度右半音量
- 切集方向固定为上滑=下一集,不跟随直播的「反转」开关
- 横滑拖进度保持不变

长按后的调节不能挂在 onScroll 上:GestureDetector 触发长按后会把后续
ACTION_MOVE 全部吞掉,onScroll 不再回调,所以这条手势由 onTouchEvent
自己驱动(handleAdjust)。

由此带出的几处状态管理问题一并修掉:

- reset() 挂在 onDown 上,而 onDown 在边缘/缩放/锁定时会提前返回。旧代码
  有 onScroll 兜底所以没暴露,改由 onTouchEvent 直接驱动后,上一次手势的
  changeBright/anchorY 会活到下一次,在边缘起手时第一个 MOVE 就改亮度并
  落盘。新增 clearGesture() 挂在每次 UP/CANCEL 上,不依赖下一次 onDown
  是否被接受;必须等 detector 处理完再清,因为 onFling 要读这些标记。
- anchorY 停在 NaN 时 deltaY 为 NaN,setVolume 两个 clamp 对 NaN 均为 false,
  (int) NaN == 0 导致静音;亮度侧 merge(NaN, ...) 返回 -1 被当成用户设定
  持久化。handleAdjust 增加「没有本次手势建立的基准就不调节」前置判断。
- downX/downY 同样不能记在 onDown 里:changeScale 在缩放结束后 500ms 才
  解除,那段窗口按下的手势拿不到自己的起点,会用上一次的起点算位移,一按
  就跳。改到 ACTION_DOWN 分支无条件记录。
- 手势轴向改为由「当前是否处于短剧全屏」推导,在 enterFullscreen /
  exitFullscreen / enterShortDramaFullscreen / onNewIntent 四处重算。
  此前只在进入时置一次:横屏短剧允许旋转,转回竖屏走 exitFullscreen 退到
  内嵌小窗后仍是短剧轴向,在详情页上竖滑会误切集;换到第二部短剧时形态
  故意保留但标记被清掉,整个解析缓冲窗口用的是长视频轴向。
- CANCEL(被父容器拦截/来电)此前不收尾,倍速卡在长按速率、HUD 常驻画面。
  长按现在是亮度/音量主入口,这个路径变常见了。
- setVolume 除以未测量的 getMeasuredHeight() 会得到 Infinity/NaN,音量一帧
  拉满或静音,补 Math.max(..., 1) 与 maxVolume <= 0 判断。
- 用实时 getPointerCount() 而非 multiTouch 判断多指:后者在 ACTION_POINTER_UP
  时不复位,会把抬起一根手指后的单指调节一起挡掉。

沉浸融合模式的内联播放器(PlayerGesture)同步同一套改动,并在
enterInlineFullscreen 补上重算——手动点全屏不走 applyInlineShortDramaMode。

TV/leanback 端没有滑动手势,无需改动。

新增 mobileShortDramaGesturesSwapAxesToAvoidMisfires 覆盖上述每一条,并把
两处 setShortDrama 调用点约束为不许传字面量,防止退回硬编码。
2026-08-31 17:54:40 +08:00
www.xueximeng.com
b208d26546 feat(mpv): add multichannel audio fallback policy
Verification: Focused MPV audio policy tests and :app:compileMobileArm64_v8aDebugJavaWithJavac passed via :app:testMobileArm64_v8aDebugUnitTest (BUILD SUCCESSFUL in 48s); upstream checkpoint validation passed with 0 errors and 0 warnings

Task-Guard: P3-3-MPV-AUDIO-FALLBACK
2026-08-31 16:06:26 +08:00
Silent1566
3b736c414d
Merge pull request #190 from Silent1566/dev3
修复:播放器里切内核不再全局生效,改回按剧集记住
2026-08-31 12:45:08 +08:00
Silent1566
4db26d042b 修复:播放器里切内核不再全局生效,改回按剧集记住
问题:在播放器内换内核会写全局默认,且历史记录记不住本剧的选择。
根因有两处:PlayerManager 的三条切内核路径都在调 PlayerSetting.putPlayer
(那是设置页的全局默认值);History.player 早前被改成 transient,Room 不再建列,
「按剧集记住」的能力一并丢失。

- 新增会话内核 PlayerSetting.getActivePlayer/putActivePlayer/clearActivePlayer(仅内存)。
  运行期所有「现在用的是哪个内核」的判断改读它:取播放地址、Source.fetch、
  IJK 自动调优、LUT 可用性、MPV 判定、OSD 面板;getPlayer() 只剩设置页默认值与兜底。
  播放器释放时清空,下次没有会话就回到全局默认。
- History.player 恢复为真实列(默认 -1 表示无偏好),数据库 43→44 加 MIGRATION_43_44
  按需加列。起播前先按本剧内核建引擎再取址(取址要按内核区分线路,顺序不能反),
  内核作为参数显式传给 SiteViewModel.playerContent。
- 内核只在用户显式选择后写回历史,且写用户选的值:例行存历史一律不碰该字段,
  否则播放页重叠存在时,上一部剧的收尾存档会用别人的会话内核覆盖本剧的选择;
  引擎类型也会被播放失败后的自动回退改掉,不代表用户改了选择。
- switchEngine 的 persist 参数改为 chosen,区分「用户选定的内核」与「失败回退换的引擎」,
  回退只换引擎不动选择。
- 服务未就绪时先记下待应用的内核,连上后由 applyPendingPlayerKernel 落到引擎,
  避免复用上一次留活的服务时引擎仍是上一部剧的内核。

测试:新增 playerKernelSwitchStaysScopedToCurrentPlayback 锁住「不写全局、退出清会话、
按剧集持久化、例行存档不改内核、服务就绪后补齐」这几条;两个 flavor 编译与单测通过
(余下 5 个失败为改动前既有:MpvPreloadControllerTest 2 项、
MultiThreadProxyPlayerUiSourceTest 1 项、FfmpegVc1SupportTest 2 项,已在干净树复现确认)。
已安装到模拟器 5558 并确认启动无崩溃、History 表 player 列迁移到位;
「切走再切回仍用本剧内核」这条端到端路径尚待人工复测。
2026-08-31 12:36:17 +08:00
Silent1566
4fac1d53d2 Merge remote-tracking branch 'origin/beta' into dev2 2026-08-31 10:57:22 +08:00
Silent1566
a2fbff15dc Merge remote-tracking branch 'origin/dev2' into dev2
# Conflicts:
#	docs/upstream-player-dependency-merge-assessment-2026-08-20.md
#	scripts/build_media_deps.sh
#	third_party/maven/androidx/media3/media3-extractor/1.11.0-alpha01-fongmi/media3-extractor-1.11.0-alpha01-fongmi.module
2026-08-31 10:55:28 +08:00
www.xueximeng.com
ec478b0b69 chore: ignore local docs directory
Verification: Added root-only /docs/ ignore rule; existing tracked documentation preserved; git diff --check passed

Task-Guard: gitignore-docs-merge-main
2026-08-31 10:47:05 +08:00
www.xueximeng.com
dae0106456 feat: simplify update download settings
Verification: UpdateRoutePlannerTest and BackupPreferenceFilterTest passed; mobile/leanback ARM64 debug Java compilation passed; XML/resource/ViewBinding processing passed; no ADB device connected for physical D-pad testing

Task-Guard: OCI1-update-settings-simplification
2026-08-31 10:28:01 +08:00
Silent1566
923e326ffb
Merge pull request #189 from Silent1566/dev4
修复 TV 版历史页删除记录后焦点跳到删除按钮
2026-08-31 09:05:07 +08:00
Silent1566
00037b01bb 修复 TV 版历史页删除记录后焦点跳到删除按钮
删除模式下每删一条记录,D-pad 焦点都会跳到右上角的「删除」按钮。
根因是 RecyclerView 移除 scrap 时先 clearFocus(),窗口兜底把焦点给了
布局里第一个可聚焦控件;等到 recoverFocusFromState() 时 hasFocus()
已为 false 直接返回,加上适配器没有 stable id,框架自身的焦点恢复
两条路径都是死的,必须由页面主动接管。

新增共享的 FocusRestorer:
- 按网格规则计算恢复位置,原位仍有条目就留在原位,整行被删空则
  上移一行保持同列(一维 clamp 会把焦点甩到上一行另一端)
- 目标行未 layout 时先 scrollToPosition 再等一次 pre-draw 重试,
  用 post 会跑在这次 layout 之前而必然拿不到 holder
- 用代际号让 cancel() 同时作废已进入重试阶段的那一次

历史页两处刷新都接上焦点恢复:单条删除用 holder 的绑定下标;
去抖刷新会按 createTime 重排,按条目身份重新定位,条目已不在新
列表里则退回原位置。退出删除模式、返回和 onStop 都取消排队中的恢复。

验证:leanback 与 mobile 两个 flavor 编译通过;新增 FocusRestorerTest
9 个测试在两个 flavor 均通过,其中穷举用例覆盖 position/count 全组合,
暴露并修掉了聚合删除一次少掉多条时的越界。
2026-08-31 08:37:43 +08:00
www.xueximeng.com
2de49b6ddd docs: record verified OCI beta publication
Verification: Beta Action 33327187989 succeeded; four OCI descriptors/manifests matched release JSON; free.hubfast.cn returned the pinned manifest; CNB skipped

Task-Guard: OCI1-oci-beta-verification
2026-08-31 02:29:52 +08:00
www.xueximeng.com
0b27856ac8 fix: pin ORAS release asset in workflow
Verification: Official ORAS 1.3.4 Linux AMD64 checksum matched; setup-oras URL/checksum mode documented upstream; workflow YAML parsed; git diff and task guard passed

Task-Guard: OCI1-oras-setup-fix
2026-08-31 02:07:19 +08:00
www.xueximeng.com
e8dba9968e docs: record Docker Hub OCI publishing setup
Verification: Docker Hub repository created; ORAS login succeeded; GitHub Actions OCI secrets and repository variable configured; git diff check and task guard passed; tracked-secret scan found no Docker PAT

Task-Guard: OCI1-dockerhub-publish-config
2026-08-31 01:40:14 +08:00
www.xueximeng.com
d4508dd30e feat: add OCI APK update source
Verification: Focused OCI update JVM tests passed after auth and route fixes; mobile and leanback ARM64 Java compilation passed; mobile ARM64 debug APK assembled; ORAS 1.3.4 local OCI artifact verified; publish script syntax/missing-config behavior, workflow YAML, CNB exclusion, and git diff checks passed; device unavailable

Task-Guard: OCI1-oci-apk-update
2026-08-31 01:20:35 +08:00
www.xueximeng.com
332f8b26c8 feat: merge APK URL push into main
Verification: Focused ApkUrlPolicyTest and ApkUrlPushTest passed; mobile and leanback Arm64 Java compilation passed; BUILD SUCCESSFUL; WebVTT paths excluded

Task-Guard: merge-apk-url-push-main
2026-08-30 22:31:24 +08:00
Silent1566
9a9dbbd6f3
Merge pull request #188 from Silent1566/dev3
Dev3
2026-08-30 20:41:38 +08:00
Silent1566
172a001445 merge: sync dev2 with beta and fongmi-sync
Verification: git diff --cached --check; :app:compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; :app:assembleMobileArm64_v8aDebug BUILD SUCCESSFUL; no unmerged paths; source fish2018/fongmi-sync@4489ca9ecc

Task-Guard: dev2-beta-fongmi-sync-20260830
2026-08-30 19:44:52 +08:00
Silent1566
5516f0815f Merge remote-tracking branch 'origin/beta' into dev3 2026-08-30 18:17:10 +08:00
Silent1566
de21d42d6f 修复:交还前台后不再发起宿主切章,并在销毁时结清本页在途请求
Verification: python 计数协议模拟 7 断言全通过(关闭后 live 归零、留 1 笔额度、迟到结果被拦、之后合法打开不被吞、onDestroy 收尾后无虚高额度);模拟器5558 实测小说 1/33->33/33 满格橙色、漫画 1/95->17/95、小说与漫画返回后阅读器实例均为 0、无崩溃;四个契约测试通过;mobile 3892/leanback 3093 仅 5 项既存失败
Task-Guard: fix-postclose-request-leak
2026-08-30 18:15:01 +08:00
Silent1566
0ba25b3f41
Merge pull request #187 from Silent1566/dev4
Dev4
2026-08-30 18:08:19 +08:00
Silent1566
bf5f430ea4 合并 origin/beta 最新代码
beta 在 dev4 上次合并(8-29 17:58)之后推了「猫源支持本地包」(6d8791c,20:06),
与 dev4 这一轮改的是同一功能,9 个文件冲突。冲突全部按「功能取并集」解决:

- NodeBundle:取 dev4 版。已逐项核对 beta 的 15 项能力(MEMBERS 白名单防同目录
  json 误判、目录/zip 形态的 marker 判定、Locale.ROOT 折叠、file:// 三种路径还原、
  ensure 的本地/zip/远端分支、非远端如实报错、规范路径比较防自我截断、isLocal
  路由、config 独立缓存判定)在 dev4 中全部具备,且 dev4 另有强制校验、staging
  原子发布、失败回滚、来源身份校验等修复。保留了 beta 的类注释(.md5 地址约定、
  为何不把运行目录指向用户目录)。
- CatSource.isBundle:两边同源,取 dev4(多了 Locale.ROOT,避免土耳其语环境下
  "INDEX.JS" 的 I 折叠成 ı 导致判定落空)。
- 两个 ConfigDialog:保留 beta 的接线 + dev4 的 type == 0 门控(目录入口只给点播,
  避免给直播/壁纸存无效路径)。
- 三个 strings.xml:dev4 新增的 dialog_config_choose_failed 与 beta 的
  player_remember_brightness 并存。
- NodeLocalBundleTest:beta 的 9 个用例在 dev4 中逐字都有,dev4 另有 13 个,取
  dev4(22 个)。ConfigDialogChooseDirTest 同理,dev4 版覆盖 beta 意图且额外钉住
  type 门控。

同时并入 beta 的非猫源改动:短剧 dock 图标入口、记住播放亮度开关、换源后竖屏形态、
短剧控件还原顺序、id 重名崩溃修复等。

验证:两个 flavor 编译通过;mobile 3921 项、leanback 3120 项,各 5 项失败,与合并前
在干净树上复跑的失败完全同一批(MpvPreloadController 2、MultiThreadProxyPlayerUiSource 1、
FfmpegVc1Support 2),为既有问题,无新增回归。猫源相关 242 项全绿(含 beta 带来的
BrightnessPolicyTest 19、VideoActivityLayoutTest 142)。
2026-08-30 18:05:49 +08:00
Silent1566
65b32d5fbb 修复:恢复阅读位置期间用户一触即停,避免慢源上反复把视口拉回旧位置
Verification: 静态核验 7 项恢复取消钩子全部就位(touchstart/pointerdown/wheel/keydown 均作废 restoreGen 并解锁上报);模拟器5558 实测小说 1/33->33/33 满格橙色、漫画 1/95->13/95、两者返回后阅读器实例0、无崩溃;契约测试与 ReaderHistoryProgressTest 通过;mobile 3892/leanback 3093 仅5项既存失败
Task-Guard: fix-restore-user-cancel
2026-08-30 17:40:48 +08:00
Silent1566
e5ae2f785b 修复猫源 bundle 的来源身份校验、缓存原子性与配置导入
评审发现并修复的用户可感知缺陷:

- NodeBundle.readLimited 用了 ByteArrayOutputStream.toString(Charset),
  该重载是 API 33+ 且不在 desugar_jdk_libs_nio 覆盖范围内,minSdk 24 下
  Android 13 以前的设备一进猫源就 NoSuchMethodError。改用 toString(name)。
- 远端来源身份原来只含 URL,服务端原地更新 bundle 后会继续复用旧的运行缓存、
  跑旧 JS。改为 remote:<url>:<bundleMd5>:<configMd5>,带上服务端公布的校验值。
- 缓存判定改为归属与内容分离:归属看落盘的来源键(兼容旧格式),内容各自比
  自己的校验值。否则服务端只改 index.config.js 也会把整个 bundle 判失效重下。
- 旧版本落盘的来源键没有内容指纹,两个文件都命中缓存后就地补齐,避免每次
  加载配置都白重启一遍 :node 子进程。
- 校验值不全时的降级只用 source.key 里安装时已校验过的摘要做交叉校验,不掺入
  服务端本次拿到的新值,否则一次 config 校验值抖动就让整个源起不来。
- NodeRuntime 的 pendingCallback/replyMessenger 缺 volatile(写在后台线程、
  读在主线程),表现为 Node 已就绪却一直转到超时。
- 旧 :node 进程在 waitForProcessDeath 超时后仍可能回报,会把旧端口写进新一轮,
  表现为选了 B 源却连到 A 源。ReplyHandler 加 generation 校验。
- install 的 backup 从复制改为移动;回滚不完整时删除 source.key 把缓存标记为
  不可信,避免把「新 index.js + 旧 config」的混合态当有效缓存。
- 启动清理上次被杀进程留下的 staging 目录和临时文件;去掉 deleteOnExit
  (Android 上进程被 kill 时 shutdown hook 不跑)。
- 本地目录包的 marker 与内容不符只告警不阻断:解压后改 index.config.js 换站点
  是主要用法,硬校验会把一批当前可用的包判死。zip 形态保持硬校验。marker 兼容
  md5sum 的「hash  文件名」两段格式。
- 配置导入按内容 md5 命名做天然去重,先写临时文件再原子移动;file:// 路径不再
  做 URL 解码(会把 + 解成空格),解码结果不存在时退回原文。
- 读不到所选内容时给出提示,不再静默 return。

测试:新增 NodeBundleInstallTest(21 个真实行为用例,覆盖安装、回滚、缓存判定、
来源键补齐、sweep)与 FileChooserImportTest(6 个);替换掉若干恒真的源码文本
断言。mobile 81 个、leanback 74 个目标用例通过,两个 flavor 编译通过。

遗留(后续提交):remoteMd5 的短 TTL 缓存、index.js marker 不符改为用户可见
提示、导入搬离主线程、缓存命中时免除 staging 复制。
2026-08-30 17:27:51 +08:00
Silent1566
ff479824e0 修复:八轮自查问题(并发切章改按在途计数收尾,避免按身份删错条目放行迟到结果)
Verification: node r9_sim 13 场景全通过(两章并发:13章送达后12章仍被拦;迟到切章被拦;无在途关闭后合法打开;TTL过期;派发失败不留额度;反复开关不累积);模拟器5558 实测小说 1/33->33/33 满格橙色、漫画 1/95->17/95、两者返回后阅读器实例0、无崩溃;四个契约测试通过;mobile 3892/leanback 3093 仅5项既存失败
Task-Guard: fix-review8-selfaudit
2026-08-30 17:15:55 +08:00
Silent1566
2b5e50bb55 修复:七轮评审问题(PDF遮罩先收再判代号、送达按令牌结清、关闭只剪过期条目、百分比迁移改用锚点收敛判据)
Verification: node r8_sim 12 场景全通过(PDF早退但遮罩已收;13章送达只结清自己、12章迟到仍被拦;关闭剪枝后合法打开不被吞;短章存90%不被覆盖、长章正常迁移);模拟器5558 实测小说滚到底 33/33 满格、漫画 1/95->17/95、PDF加载失败显示错误文案且无遮罩残留、返回后阅读器实例0、无崩溃;四个契约测试通过;mobile 3892/leanback 3093 仅5项既存失败
Task-Guard: fix-review7
2026-08-30 16:35:17 +08:00
Silent1566
7ab4e1cfb0 修复:七轮自查问题(关闭时清在途表避免累积误吞、送达只结清对应请求、旧百分比迁移不倒退位置)
Verification: node r7_sim 13 场景全通过(反复开关10次后合法打开不被吞且在途表不累积、迟到切章仍被拦、送达一章不清掉另一次在途、C撤销后B仍被拦、短章存90%迁移不倒退);模拟器5558 实测小说滚到底 33/33 满格橙色、漫画 1/95->18/95、两者返回后阅读器实例0、无崩溃;四个契约测试通过;mobile 3892/leanback 3093 仅5项既存失败
Task-Guard: fix-review7-selfaudit
2026-08-30 15:33:35 +08:00
www.xueximeng.com
3005574c10 fix(mpv): preselect persisted subtitle before load
Verification: MpvInitialTrackSelectionPolicyTest PASS; MpvTrackSelectionTest PASS; assembleLeanbackArmeabi_v7aDebug PASS; APK sha256 f08158bae721a6862f05a013a04b93e515c02434cc48c18219c76c3e0dc62fa1

Task-Guard: FIX-MPV-PERSISTED-SUBTITLE-PRESELECT
2026-08-30 15:17:49 +08:00
Silent1566
83819bdc78 修复:六轮评审问题(在途切章改用请求表、PDF getDocument 回调带代号、跨类型换章作废PDF代号、百分比恢复等高度稳定、宿主销毁中拒绝派发)
Verification: node r6_sim 11 场景全通过(在途表取代单槽:C撤销后B仍被拦、全撤销后合法打开、TTL过期;getDocument 双回调带代号:旧章失败不覆盖新章内容、旧doc不进新章;PDF切漫画不插翻页按钮;百分比恢复等高度稳定不再首帧上报);模拟器5558 实测小说 1/33->33/33 满格橙色、漫画 1/95->18/95、两者返回后阅读器实例0、无崩溃;四个契约测试通过;mobile 3892/leanback 3093 仅5项既存失败
Task-Guard: fix-review6
2026-08-30 15:11:02 +08:00
www.xueximeng.com
4f801a1e50 fix(mpv): restore subtitles before autoplay
Verification: MpvInitialTrackSelectionPolicyTest PASS; assembleLeanbackArmeabi_v7aDebug PASS; APK sha256 9ef1f0f22045b574d543a80a07a8cea31483824fc76e2568e6684b4ae4465a1f

Task-Guard: FIX-MPV-PERSISTED-SUBTITLE-STARTUP-GATE
2026-08-30 14:58:10 +08:00
www.xueximeng.com
ece528179a fix(mpv): stabilize subtitle and transient surface lifecycle
Verification: MpvOsdSurfacePolicyTest and assembleLeanbackArmeabi_v7aDebug passed; TV validation shows materially improved Surface resume with one remaining instant reconfiguration

Task-Guard: FIX-MPV-OSD-STARTUP-RELOAD
2026-08-30 14:32:03 +08:00
Silent1566
27265c2a99 修复:旧百分比记录在漫画/PDF 上主动催加载,避免既恢复不了也迁移不了
Verification: node pct_sim 7 场景全通过(修复前 95 页漫画旧百分比记录 ready 恒为 false、修复后为 true;小说/PDF 均可;SCALE 章位置正确);模拟器5558 实测小说 1/33->33/33、漫画 1/95->13/95、两者返回后阅读器实例0、无崩溃;四个契约测试通过;mobile 3892/leanback 3093 仅5项既存失败
Task-Guard: fix-percent-comic-restore
2026-08-30 14:15:13 +08:00
Silent1566
76fc6bcd33 修复:五轮评审问题(无关失败不再撤销在途切章标记、宿主派发失败即时收尾、PDF跨章回调隔离与抛错计数、恢复百分比等待排版就绪、令牌volatile与JS单调时钟)
Verification: node d_sim 10 场景全通过(空URL失败不抹在途标记、迟到结果仍被拦、派发失败立即撤销、旧章PDF回调不计入新章、抛错页仍计数、单调时钟);模拟器5558 实测小说 1/33->33/33(读完满格)、漫画 1/95 微滚不虚报->18/95、两者返回后阅读器实例0、无崩溃;四个契约测试通过;mobile 3892/leanback 3093 仅5项既存失败
Task-Guard: fix-review5
2026-08-30 13:52:39 +08:00
Silent1566
c4ff676ee8 修复:五轮自查问题(SCALE 规模章不与旧百分比记录同形、百分比恢复不覆盖已存位置、缓存 TTL 改单调时钟)
Verification: node token_sim 9 场景全通过(令牌归属、单页/两页 settled 边界);新增 SCALE 冲突单测通过(duration==SCALE 时不把读完编码成 duration,避免与旧百分比记录同形);百分比恢复仅在页面撑开后才上报,避免覆盖成锚点0;缓存 TTL 改单调时钟;模拟器5558 实测小说滚到底 33/33、漫画 1/95->13/95、两者返回后阅读器实例0、无崩溃;四个契约测试通过;mobile 3892/leanback 3093 仅5项既存失败
Task-Guard: fix-scale-collision
2026-08-30 12:53:27 +08:00
www.xueximeng.com
23a3c74417 fix(mpv): restore direct subtitle controls and armv7 parity
Verification: bash scripts/verify_mpv_native_assets.sh --require-elf; bash ./gradlew :app:compileLeanbackArm64_v8aDebugJavaWithJavac --no-daemon

Task-Guard: FIX-MPV-ARMV7-SUBTITLE
2026-08-30 12:48:31 +08:00
Silent1566
826b20cc9a 修复:四轮评审问题(切章标记按令牌撤销、PDF渲染失败仍计数、换章清锚点记忆、漫画末两页判据、旧百分比记录解锁上报)
Verification: node final_sim 16 场景全通过(令牌归属撤销:B在途时C失败不抹B、C迟到仍被拦、自身失败撤销后合法打开;存量记录不平移;读完100%;PDF渲染失败仍计数;换章memo归零;时钟回跳TTL仍过期;漫画末两页判据;旧百分比记录迁移不漂移);模拟器5558 实测小说滚到底33/33、漫画1/95微滚不虚报->18/95、两者返回后阅读器实例0、无崩溃;四个契约测试通过;mobile 3891/leanback 3092 仅5项既存失败
Task-Guard: fix-review4-remaining
2026-08-30 12:20:12 +08:00
www.xueximeng.com
3a408780f8 Merge fongmi-sync into main without temporary docs 2026-08-30 11:42:05 +08:00
www.xueximeng.com
4489ca9ecc docs(governance): persist upstream assessment workflow 2026-08-30 11:10:09 +08:00
Silent1566
013ef6a2df 修复:四轮自查问题(避免历史进度平移改为仅编码读完态、切章标记按发起方撤销、静默期与标记时限改用单调时钟)
Verification: 新增 ReaderHistoryProgressTest 6 项行为测试全通过(读完满格、中途原样存、往返一致含 total=1/2/3/33/95、反复开退不漂移、存量记录不被误判读完、退化输入不崩);node 代号 6 场景全通过(无关失败不抹标记、自身失败撤销、时间回跳后 TTL 仍能过期、TTL内仍拦、送达清标记);模拟器5558 实测小说滚到底 33/33、漫画 1/95 微滚不虚报->18/95、两者返回后阅读器实例 0、无崩溃;四个契约测试通过;mobile 3890/leanback 3091 仅 5 项既存失败
Task-Guard: fix-review4-selfaudit
2026-08-30 11:02:33 +08:00
www.xueximeng.com
a29c78372a docs(c2): record first-frame fix recovery point
Verification: Recorded exact verified implementation commit and recovery tag; prior scoped diff, checkpoint, unit test, build, and TV evidence passed

Task-Guard: C2-DV7-P81-BSF-FIRST-FRAME-RECORD
2026-08-30 10:32:19 +08:00
www.xueximeng.com
fa6a9ab2df fix(mpv): reveal direct video at playback restart
Verification: MpvAutoOutputPolicyTest plus Leanback arm64 build passed; TV traces p-dnwxvd-4 and p-dnyatr-6 show shutter release at 1.603s/1.021s, mediacodec_embed, dropped=0, rebufferCount=0

Task-Guard: C2-DV7-P81-BSF-FIRST-FRAME
2026-08-30 10:31:26 +08:00
www.xueximeng.com
3db8252c95 fix(mpv): separate DV source labels from playback profile
Verification: DolbyVisionFormatLabelTest and Leanback arm64 build passed; TV trace p-dn3rgx-4 stayed mediacodec_embed/mediacodec with zero GPU transition and dropped frames stable at 1

Task-Guard: C2-DV7-P81-BSF-PANEL
2026-08-30 10:08:26 +08:00
Silent1566
9a7a9510a9 修复:三轮评审问题(退化态统一由 anchorsSettled 把关、切章标记失败侧撤销与超时过期、阅读进度按1基落库使读完为100%)
Verification: node 18 场景全通过(漫画第31页起全失败不虚报95、PDF未绘制canvas不虚报、图全失败轻扫到底不虚报、小说滚到底33/33、memo副作用、部分加载不上报、历史进度读完100%与往返一致);node 代号 8 场景全通过(含宿主静默失败撤销、TTL过期、TTL内仍拦);模拟器5558 实测小说1/33->33/33、漫画1/95微滚不虚报->17/95、两者返回后阅读器实例0、无崩溃;三个契约测试通过;mobile 3882/leanback 3083 仅5项既存失败
Task-Guard: fix-review3
2026-08-30 10:02:45 +08:00
Silent1566
47cf19dada Apply three precise fixes for node bundle md5 read limit, NodeRuntime install source tracking, and FileChooser atomic import
Verification: Three precise fixes applied: NodeBundle remote md5 read limit and invalid checksum rejection; NodeRuntime records install source only for remote and READY; FileChooser persistent import uses temp file then atomic move. Local tests pass.
Task-Guard: merge-beta-review-20260829
2026-08-30 09:21:37 +08:00
Silent1566
13650ae326 修复:末锚点判据改用文档末尾,漫画额外要求末页有真实高度
Verification: node 11 场景全通过(含末页图加载失败不虚报、小说滚到底记满 33/33、memo 副作用、PDF 未绘制 canvas 不虚报、部分加载不上报);模拟器5558 实测小说 1/33->33/33、漫画 1/95 微滚不虚报->18/95、两者返回后阅读器实例 0、无崩溃;三个契约测试通过;mobile 3881/leanback 3082 仅 5 项既存失败
Task-Guard: fix-anchor-end-hardening
2026-08-30 08:45:15 +08:00
www.xueximeng.com
b1f07cea3d fix(mpv): drop stale DV7 enhancement configuration
Verification: Leanback arm64 build passed; TCL MT9655 trace p-diwh05-1 produced first frame at 7604ms, advanced to 17081ms with dropped=0/rebufferCount=0, no decoder Released or HDR10 fallback; git diff --check and upstream checkpoint verification passed

Task-Guard: C2-DV7-P81-BSF-CSD
2026-08-30 08:11:07 +08:00
Silent1566
0b9016cf35 修复:二轮评审问题(进度落库与读数同源、parse=1 兜底补打切章代号、短路导致标记留存、恢复超时按目标锚点判定)
Verification: node 9 场景全通过(含小说读到章末 33/33 且落库值 32 与读数同源、恢复超时部分加载不上报、min-height 陷阱);node 代号模拟 5 场景全通过(含 || 短路泄漏);模拟器5558 实测小说 1/33->12/33->33/33、漫画 1/95 微滚不虚报->18/95、小说与漫画返回后阅读器实例均为 0 且无崩溃;三个契约测试通过;mobile 3881/leanback 3082 全量仅 5 项既存失败
Task-Guard: fix-review2-remaining
2026-08-30 07:50:37 +08:00
www.xueximeng.com
e343efd2e5 docs: record C2 Dolby decoder release evidence
Verification: latest TV trace p-dhezv2-1 frozen and analyzed; diagnostic Java diff removed; git diff --check passed

Task-Guard: C2-DV7-P81-BSF
2026-08-30 07:34:01 +08:00
Silent1566
5e5a410c9e 修复:漫画图片未解码时轻扫到底不再把退化测量当成可信进度
Verification: node 6 场景全通过(含 min-height 陷阱:漫画未解码+轻扫到底应为 1/95 而非 5/95);模拟器5558 复测微滚保持 1/95、正常滚动 18/95 且与画面 PAGE 18 一致;ReaderPlaybackRoutingSourceTest 通过
Task-Guard: fix-anchor-mindheight-trap
2026-08-30 07:18:52 +08:00
Silent1566
1815fdd8df 修复:切章结果送达前台后清除在途标记,避免误吞之后的合法阅读打开
Verification: node 模拟三场景:迟到切章结果被吞、切章送达前台、关闭后合法新打开不被吞,修复前第三项失败(误吞)、修复后全通过;模拟器5558 复测小说 1/33->12/33、返回退出无崩溃;ReaderPlaybackRoutingSourceTest/AppBrandingContractTest/VideoActivityLayoutTest 通过
Task-Guard: fix-pending-chapter-tag-leak
2026-08-30 06:10:45 +08:00
Silent1566
24ee35ab9d 修复:评审问题(进度判据改用 bottom、恢复超时不清位置、阅读器回前台重登记、迟到切章结果不再拉起阅读器)
Verification: 模拟器5558实测:小说33段 1/33->13/33 随滚动推进(修复前因 height 判据恒0而永久停在1/33)、95页漫画 1/95->13/95 与画面 PAGE 13 一致、返回键退出无崩溃;WebView 探针实测确认 content-visibility 段落 height 恒为 0 而 bottom 有效,据此改用 bottom 判据;ReaderPlaybackRoutingSourceTest/AppBrandingContractTest/VideoActivityLayoutTest 通过;mobile 3880/leanback 3081 全量仅5项既存失败(干净基线已复测无关)
Task-Guard: fix-reader-review-round2
2026-08-30 05:51:05 +08:00
Silent1566
8cf6a1fe33 Merge remote-tracking branch 'origin/beta' into dev3 2026-08-30 03:35:56 +08:00
Silent1566
82a1fab7b1 修复:站点名与线路图标恢复、选集按钮文本居中、阅读器返回与首帧进度、原版图标缩放
Verification: 模拟器5558实测:首页标题显示配置名而非默影视、logo 显示配置线路图标;桌面原版图标立方体占比56.2%x64.6%与同机原版应用一致(修复前43%);95页漫画打开显示1/95、滚到PAGE15显示15/95;返回键退出阅读器不再被重新拉起。单测三个契约测试通过;mobile 3863/leanback 3070 全量仅5项既存失败(stash干净基线复测确认无关)
Task-Guard: fix-branding-episode-icons
2026-08-30 03:35:29 +08:00
Silent1566
8c515e4cce
Merge pull request #186 from Silent1566/dev3
Dev3
2026-08-30 01:06:41 +08:00
Silent1566
39679ed84a 修复:三轮评审问题(换源后交还竖屏、亮度开关双向清理、画质单一真值、id 检测器覆盖布局变体)
Verification: compileMobileArm64_v8aDebugJavaWithJavac 通过;全量 testMobileArm64_v8aDebugUnitTest 3860 用例仅 5 个既存失败(MpvPreloadController/MultiThreadProxy/FfmpegVc1,已于干净基线复测确认无关);C3 与画质单一真值两条新断言均经删码反证;检测器变体覆盖经注入 layout-land 独有撞名 id 反证
Task-Guard: review-fixes-brightness-dock
2026-08-30 00:41:26 +08:00
www.xueximeng.com
3c405de2db docs: close C2 chapter startup stall fix
Verification: Documentation-only closure: recorded code commit a83fe86baa, recovery tag recovery/C2-DV7-P81-BSF/20260830003041-a83fe86baa24, targeted verification results, and TV-device residual risk.

Task-Guard: C2-DV7-P81-BSF
2026-08-30 00:31:41 +08:00
www.xueximeng.com
a83fe86baa fix(mpv): defer startup chapter metadata for DV7 P8.1
Verification: TV log root cause: FILE_LOADED synchronous chapter-list JNI read stalled main thread up to 27113ms; gated startup chapter reads for P8.1 and restored after PLAYBACK_RESTART. Gradle targeted C2 unit tests plus Mobile arm64 Java compile passed; git diff --check passed. TV ADB/live endpoint unavailable, so device playback remains unverified.

Task-Guard: C2-DV7-P81-BSF
2026-08-30 00:30:41 +08:00
www.xueximeng.com
16e5d50d9f fix(mpv): fallback converted DV7 P8.1 on startup timeout
Verification: MpvDolbyVisionFallbackPolicyTest and MpvTrackRefreshPolicyTest passed; :app:compileMobileArm64_v8aDebugJavaWithJavac passed; :app:assembleLeanbackArm64_v8aDebug passed with APK SHA-256 e801f04e9e57baa3a537eb542b1b4a5b69f7e1c59993ac89dac4c56c6ff1379e; adb devices empty so TV playback remains unverified

Task-Guard: C2-DV7-P81-BSF
2026-08-29 22:27:49 +08:00
www.xueximeng.com
d1bf67157e fix(mpv): avoid blocking disabled subtitle track queries
Verification: MpvOsdSurfacePolicyTest passed; :app:compileMobileArm64_v8aDebugJavaWithJavac passed; :app:assembleLeanbackArm64_v8aDebug passed; git diff --check passed; ADB 192.168.1.5:5555 returned Connection refused, so TV P7 FEL replay remains unverified and documented

Task-Guard: C2-DV7-P81-BSF
2026-08-29 21:14:47 +08:00
www.xueximeng.com
408182daae docs: record C2 implementation checkpoint
Verification: C2 implementation commit ae337b81e4; native assets, arm64 APK builds, and policy test passed; device freeze evidence recorded as unresolved risk

Task-Guard: C2-DV7-P81-BSF
2026-08-29 21:02:09 +08:00
Silent1566
492d550c01
Merge pull request #185 from Silent1566/dev1
新增:猫源支持本地包,可选文件夹或 zip 导入
2026-08-29 20:33:03 +08:00
Silent1566
f3e6e5b434 修复:原生增强非卡片选集采用标准尺寸
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.adapter.TmdbEpisodeAdapterTest (BUILD SUCCESSFUL)
Task-Guard: native-enhanced-episode-size
2026-08-29 20:31:59 +08:00
Silent1566
81749659e5 Merge remote-tracking branch 'origin/beta' into dev3 2026-08-29 20:29:48 +08:00
Silent1566
23123b9fbb 修复:短剧 dock 图标 id 与详情页 quality/episodes 重名导致启动崩溃
Verification: compileMobileArm64_v8aDebugJavaWithJavac 通过;VideoActivityLayoutTest 141 用例通过;新增 id 遮蔽检测器经反证验证(临时改回 quality 即失败并精确报出 RecyclerView/AppCompatImageView 冲突);全量 3844 用例仅 5 个既存失败
Task-Guard: shortdrama-dock-id-collision
2026-08-29 20:23:08 +08:00
Silent1566
0170fd11ff Merge remote-tracking branch 'origin/beta' into dev1 2026-08-29 20:13:01 +08:00
Silent1566
6d8791c6e5 新增:猫源支持本地包,可选文件夹或 zip 导入
参考 PeekPro 的判定约定(目录里有 index.js.md5 即视为 CatPawOpen 本地包),
让猫源不再只能填远端 .js.md5 地址。

- NodeBundle:ensure 前置本地分支,解压后的目录走复制、原始 zip 走逐条目解压,
  都落到 filesDir/node/bundle 由 Node 加载。不直接指向用户目录,因为 Node 要在
  bundle 同级写 data/、port、boot.js,外部存储未必允许且用户可能随时移走。
  缓存判定:目录形态用文件实际 md5,zip 形态用包内附带的 .md5,命中则跳过复制。
- CatSource.isBundle:除后缀匹配外增加本地包判定,让 VodConfig 把本地路径路由到
  Node 运行时。
- 配置对话框补「选文件夹」入口:mobile 用输入框 startIcon,leanback 加独立按钮。
  原来只有文件选择器,选不到目录,这个功能从界面上用不了。

三处评审自查修正:
- 指到单个文件时只认包内四个文件名,否则与包同目录的普通订阅 json 会被误判成
  本地包,导致选了 A 源却加载出 B 源。
- ensure 落到远端分支前校验地址可下载。本地包在主进程判定、在 :node 子进程加载,
  中途包被移走会走到下载分支,而那里拿不到 md5 时一律复用旧缓存,会把上一个源的
  bundle 当就绪跑起来。
- 大小写折叠固定用 Locale.ROOT;复制循环收敛为一处 pipe()。
- 运行目录本身满足本地包判定(stamp 文件恰好叫 index.js.md5),用户指到它时源和
  目标同一文件,开写会截断 bundle,用规范路径比较挡掉。

验证:新增 NodeLocalBundleTest(9) 与 ConfigDialogChooseDirTest(4),相关 82 项全绿;
两个 flavor 编译通过。模拟器 5554 实测走 UI 选文件夹加载成功(42 站点),并通过改动
包内文件确认数据确实取自本地目录;包外 json 不再被误判。

全量 mobile 单测另有 5 项失败(MpvPreloadController 2、MultiThreadProxyPlayerUiSource 1、
FfmpegVc1Support 2),已在干净树复跑确认为既有问题,与本次无关。
2026-08-29 20:06:28 +08:00
www.xueximeng.com
ae337b81e4 mpv: complete DV7 to P8.1 fallback integration
Verification: verify_mpv_native_assets.sh --require-elf passed for arm64-v8a and armeabi-v7a; :app:assembleMobileArm64_v8aDebug and :app:assembleLeanbackArm64_v8aDebug passed; MpvDolbyVisionFallbackPolicyTest passed; adb unavailable (192.168.1.9:5555 connection refused), documented as remaining device risk

Task-Guard: C2-DV7-P81-BSF
2026-08-29 20:00:55 +08:00
Silent1566
09fe9f68d9 优化:短剧 dock 的换源/画质/选集改为图标入口
Verification: testMobileArm64_v8aDebugUnitTest --tests VideoActivityLayoutTest 通过;全量 3843 用例仅 5 个既存失败(已于本会话前在干净基线复测确认无关)
Task-Guard: shortdrama-dock-icons
2026-08-29 19:44:04 +08:00
Silent1566
af0bc991d9 修复:换源后短剧竖屏形态不再退回长视频布局
Verification: testMobileArm64_v8aDebugUnitTest --tests VideoActivityLayoutTest 通过(含新回归 mobileShortDramaPresentationSurvivesSourceChange)
Task-Guard: shortdrama-session-mode
2026-08-29 19:28:56 +08:00
Silent1566
5702ba0e17
Merge pull request #184 from Silent1566/dev4
Dev4
2026-08-29 18:46:44 +08:00
Silent1566
efcb10495b 修复:短剧控件还原改为先摘下再按原始索引升序插回
Verification: testMobileArm64_v8aDebugUnitTest --tests VideoActivityLayoutTest 通过;全量 3842 用例仅 5 个失败,已 stash 复测确认为改动前既存失败(MpvPreloadController/MultiThreadProxy/FfmpegVc1,与本改动无关)
Task-Guard: shortdrama-restore-order
2026-08-29 18:36:11 +08:00
Silent1566
dd5bd42694 完善:短剧模式补上换源与画质入口,按原始顺序搬入右侧 dock
Verification: compileMobileArm64_v8aDebugJavaWithJavac 通过;testMobileArm64_v8aDebugUnitTest --tests VideoActivityLayoutTest 通过(含两条新回归)
Task-Guard: shortdrama-change-quality-dock
2026-08-29 18:29:11 +08:00
Silent1566
114e469b0f 新增:播放器设置页「记住播放亮度」开关(默认关闭)
Verification: compileMobileArm64_v8aDebugJavaWithJavac 通过(ViewBinding 生成 rememberBrightness 绑定,布局与 Fragment 引用一致)
Task-Guard: brightness-remember-setting
2026-08-29 18:22:11 +08:00
Silent1566
7e344ada49 修复:播放页不再无条件套用记忆亮度,退出时交还系统
Verification: compileMobileArm64_v8aDebugJavaWithJavac 通过;testMobileArm64_v8aDebugUnitTest --tests BrightnessPolicyTest 通过(含两条新回归)
Task-Guard: brightness-remember-core
2026-08-29 18:21:05 +08:00
Silent1566
9a453edb65 合并 origin/beta 最新代码 2026-08-29 18:16:21 +08:00
Silent1566
ffcae62b2c fix: center native enhanced episode text list 2026-08-29 17:43:37 +08:00
Silent1566
d5ca5837bc
Merge pull request #181 from Silent1566/dev4
Dev4
2026-08-29 17:17:58 +08:00
Silent1566
34f8acc6e1
Merge pull request #183 from Silent1566/dev3
修复:TMDB 详情页集数卡片兜底图按设备比例选剧照或海报
2026-08-29 17:17:35 +08:00
Silent1566
fde1cdfb6a 完善:无 TMDB 条目时集数卡片横图退进场 wallPic,宽卡片不再吃竖海报
上一提交把横图槽位收紧到只认当前 TMDB 条目的剧照,代价是原生源(压根没有 TMDB
条目)在宽屏下横图为空,卡片只能退竖海报,宽卡放竖图观感差。

这里按来源可信度补回横图,而不是把删掉的链原样放回:
- 不用 mHistory.getWallPic()。leanback hydrateFastTmdbPlaybackDetail() 会把
  cachedFastTmdbBackdrop() 写进 history 的 wall,重新匹配后残留的正是上一条匹配
  的横图,退它等于换个入口把刚修掉的陈旧值放回来。
- 不用 getContextWall()。那条链混了 mVod.getPic()/mHistory.getVodPic() 等竖海报,
  与按比例选图的约定相悖。
- 退 intent 的 wallPic,并门控在「没有 TMDB 条目」:wallPic 随 onNewIntent 的
  putExtras 跟随条目刷新,全仓只喂给 setContextWall,是这里唯一可信的横图;一旦
  TMDB 条目就位仍只认该条目自己的剧照,已修的旧背景图 bug 不会回来。
TmdbDetailActivity 同形:仅 matchedTmdbDetail/matchedTmdbItem 都为空时退
tmdb_backdrop,applyManualTmdb() 重新匹配成功后这条自动失效。

补一条源码断言守卫锁住该不变式,两侧放宽都会被测试挡下。

Verification: compileMobileArm64_v8aDebugJavaWithJavac + compileLeanbackArm64_v8aDebugJavaWithJavac + testMobileArm64_v8aDebugUnitTest(EpisodeCard*/TmdbEpisodeAdapterTest/EpisodeListSeasonRowTest/TmdbUIAdapterTest) BUILD SUCCESSFUL, 83 用例 0 失败
Task-Guard: episode-fallback-landscape-native-wall
2026-08-29 17:13:01 +08:00
Silent1566
cf3adc481b fix: 扩展 TMDB 默认站点排除规则 2026-08-29 16:57:53 +08:00
Silent1566
2cb44f56ca 修复:集数卡片横向兜底图只取当前条目,避免显示上一部剧的背景图
分集卡片兜底图的横图槽位此前会退到进场 intent 的 wallPic/contextWall/tmdb_backdrop。
这些值在同一 Activity 内切换条目后不更新,宽屏优先横图时旧值会挡在当前条目前面,
卡片显示成上一部剧的背景图;且这些链路混入了竖向海报,与按比例选图的约定相悖。
现在三处横图取值只认当前 TMDB 条目自己的横图,缺图时交由 EpisodeCardImagePolicy
退到本身就以当前条目优先的海报链。补充两端比例均缺图返回空串的用例。

Verification: compileMobileArm64_v8aDebugJavaWithJavac + compileLeanbackArm64_v8aDebugJavaWithJavac + testMobileArm64_v8aDebugUnitTest(EpisodeCard*/TmdbEpisodeAdapterTest/EpisodeListSeasonRowTest) BUILD SUCCESSFUL, 23 用例 0 失败
Task-Guard: episode-fallback-backdrop-current-item
2026-08-29 16:40:24 +08:00
Silent1566
a318078a05 修复:猫源动作地址解码保留完整 Base64
Verification: gradlew :app:testMobileArm64_v8aDebugUnitTest and :app:testLeanbackArm64_v8aDebugUnitTest passed for CatWebWiringTest, ReaderPlaybackRoutingSourceTest, NodePortSelectionTest, AppBrandingContractTest
Task-Guard: merge-beta-review-push
2026-08-29 16:00:35 +08:00
Silent1566
0978defaa9 Merge remote-tracking branch 'origin/beta' into dev3 2026-08-29 15:54:23 +08:00
Silent1566
6fcc3fa301 修复:TMDB 详情页集数卡片兜底图按设备比例选剧照或海报
Verification: assembleMobileArm64_v8aDebug + compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; emulator-5558 实机确认宽屏卡片兜底改为横向剧照
Task-Guard: tmdb-detail-card-ratio-fallback
2026-08-29 15:53:57 +08:00
Silent1566
ee5daf5b1d Merge remote-tracking branch 'origin/beta' into dev4 2026-08-29 15:30:44 +08:00
Silent1566
14757e4478 fix: 自动季度用解析结果绑定集数据
Verification: TmdbDetailActivityLayoutTest passed; assembleMobileArm64_v8aDebug succeeded; installed to emulator-5560 and user confirmed auto-season stills and long-press details work
Task-Guard: tmdb-auto-episode-still
2026-08-29 15:28:10 +08:00
Silent1566
b8815812eb fix(episode): pick episode card fallback art by screen ratio
Verification: compileMobileArm64_v8aDebugJavaWithJavac + compileLeanbackArm64_v8aDebugJavaWithJavac + testMobileArm64_v8aDebugUnitTest(EpisodeCard*) BUILD SUCCESSFUL
Task-Guard: episode-card-ratio-fallback
2026-08-29 15:13:37 +08:00
Silent1566
ef5a07e277 test: 锁定 TMDB 自动季度重置行为
Verification: :app:testMobileArm64_v8aDebugUnitTest -TmdbDetailActivityLayoutTest passed; assembleMobileArm64_v8aDebug succeeded; emulator-5560 manual recheck restored S1 posters after auto
Task-Guard: tmdb-auto-season-fix
2026-08-29 14:58:55 +08:00
www.xueximeng.com
5e90c2ed76 docs: streamline explicit task closure 2026-08-29 14:15:39 +08:00
www.xueximeng.com
8f14b85813 docs(mpv): close P4-4 autoplay pause race
Verification: P4-4 document and assessment index validation

Task-Guard: P4-4-MPV-AUTOPLAY-PAUSE-RACE-CLOSURE
2026-08-29 13:58:31 +08:00
www.xueximeng.com
e8a1582d74 fix(mpv): preserve autoplay intent across pause callbacks
Verification: MpvPauseIntentPolicyTest; mobile arm64 debug APK; V2453A cold launch and two warm replacements auto-advanced

Task-Guard: P4-4-MPV-AUTOPLAY-PAUSE-RACE
2026-08-29 13:57:15 +08:00
Silent1566
2f285a0a79
Merge pull request #182 from Silent1566/dev1
新增:猫源设置页支持导入导出,动作项点击直达不再闪播放页
2026-08-29 13:43:24 +08:00
www.xueximeng.com
025f15ec4a docs: close P4-3 Surface teardown
Verification: documentation hash/tag linkage, git diff --check, task guard, and upstream checkpoint verification passed

Task-Guard: P4-3-MPV-SURFACE-TEARDOWN-CLOSURE
2026-08-29 13:29:23 +08:00
www.xueximeng.com
8250e2204f mpv: avoid terminal Surface reconfiguration
Verification: MpvSurfaceTeardownPolicyTest + assembleMobileArm64_v8aDebug; V2453A PiP return, terminal end-file/shutdown without post-Surface decoder creation or no-Surface error, fresh reopen PLAYING

Task-Guard: P4-3-MPV-SURFACE-TEARDOWN
2026-08-29 13:28:06 +08:00
Silent1566
a463bba89e Merge remote beta and harden node startup 2026-08-29 13:08:46 +08:00
Silent1566
27e2917d51
Merge pull request #180 from Silent1566/dev3
Dev3
2026-08-29 13:07:48 +08:00
Silent1566
d7a95f8ae1 Fix reader guard order after review
Verification: gradlew :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.ReaderPlaybackRoutingSourceTest and :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.ReaderPlaybackRoutingSourceTest both passed
Task-Guard: fix-reader-guard-order-after-review
2026-08-29 13:01:34 +08:00
Silent1566
92c0a68219 Merge remote-tracking branch 'origin/beta' into dev3 2026-08-29 12:54:59 +08:00
www.xueximeng.com
ea23c1dc16 docs(mpv): assess terminal Surface teardown race
Verification: P4-3 decision record includes current logcat, pre-C0-M evidence, Android Surface contract, locked FFmpeg/mpv-android source/history, alternatives, acceptance and rollback; git diff --check and upstream checkpoint verification passed

Task-Guard: P4-3-MPV-SURFACE-TEARDOWN
2026-08-29 12:44:42 +08:00
www.xueximeng.com
8e942a2b86 docs(mpv): close C0-M implementation record
Verification: C0-M implementation commit/tag, device verification, FFmpeg source trigger, current logcat teardown sequence, and pre-C0-M occurrence recorded; git diff --check passed

Task-Guard: C0-M-MPV-FFMPEG-9.0.1-CLOSURE
2026-08-29 12:35:18 +08:00
www.xueximeng.com
9b7cf9cfbb build(mpv): align FFmpeg with 9.0.1
Verification: FFmpeg 177f090e0503b7e013922ca903bde14b1c375f18 prepare-only; dual-ABI native build/install; verify_mpv_native_assets --require-elf; Mobile arm64 debug APK assemble and asset identity; V2453A MPV subtitle/AAC/E-AC3/TrueHD/DTS-HD/LPCM/DTS playback, seek, PiP lifecycle, stop/shutdown, empty crash buffer

Task-Guard: C0-M-MPV-FFMPEG-9.0.1
2026-08-29 12:29:47 +08:00
Silent1566
cae5cb9ddf Fix reader back routing and duplicate playback start
Verification: gradlew :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.ReaderPlaybackRoutingSourceTest and :app:testMobileArm64_v8aDebugUnitTest both passed
Task-Guard: fix-reader-back-player-start
2026-08-29 12:20:29 +08:00
Silent1566
594d7b1d5c 合并:同步 beta 最新代码 2026-08-29 12:12:45 +08:00
Silent1566
ef7711e599 修复:网页主题首页点猫源动作项仍先闪详情页
首页用 Web 主题渲染时,条目点击走 navigation.openDetail 桥而不是原生列表,
那条路直接调 TmdbDetailActivity.start,不经 ContentDispatcher —— 上一版只在
原生入口分流,动作项在这条路上原样闪详情页(实测 START 先是
TmdbDetailActivity,1 秒后才是 CatWebActivity,且 cat-action 判定日志为空,
说明分流代码未被调用)。

在 openDetail 里补同一个分流,排在打开详情页之前。

验证:emulator-5554 网页主题首页实测「点击配置」只有一次 START 直指
CatWebActivity、详情页零命中,判定日志打出解出的地址;「扫码配置」仍进
详情页看二维码。CatAction/CatWeb 相关单测 32 项全绿。
2026-08-29 12:09:36 +08:00
Silent1566
9f30cd00c8 Use the active launcher icon for in-app branding
Verification: 5560 最新 APK 运行时偏好 app_branding_icon=1,launcher query=HomeActivityHistory,任务栈仅 HomeActivity;顶栏 logo 区域白色像素 2589、无蓝色主色,符合原版图标;AppBrandingContractTest 与 leanback assemble BUILD SUCCESSFUL in 26s
Task-Guard: diagnose-branding-mode-5560
2026-08-29 11:55:01 +08:00
Silent1566
2c2635f8d4 Use selected branding for mobile home logo
Verification: AppBrandingContractTest passed for both mobile and leanback: BUILD SUCCESSFUL in 3m 5s; mobile arm64 APK assembled in 23s and installed successfully on emulator-5554; app_branding_icon=1, task contains only HomeActivity after launch; mobile VodFragment now calls AppBranding.applyLogo instead of ImgUtil.logo
Task-Guard: fix-mobile-in-app-brand-logo
2026-08-29 11:05:20 +08:00
www.xueximeng.com
5f865d0dbd docs(mpv): close P4-1 shutdown task
Verification: documentation-only closure records verified implementation commit, recovery tag, rollback, and residual device-coverage risk

Task-Guard: P4-1-MPV-JNI-SHUTDOWN
2026-08-29 10:33:01 +08:00
www.xueximeng.com
907bfca982 fix(mpv): serialize JNI shutdown requests
Verification: dual-ABI JNI build; MPV ELF/assets verification; Mobile arm64 Debug APK build; vivo V2453A Android 15 command-driven play/seek/Surface recreate/rapid switch/destroy-recreate; native event: shutdown; no crash, ANR, fatal signal, or destroyed mutex

Task-Guard: P4-1-MPV-JNI-SHUTDOWN
2026-08-29 10:32:12 +08:00
Silent1566
0f1a75a292
Merge pull request #179 from Silent1566/dev3
修复:TMDB 匹配对话框结果恢复按标题相似度排序
2026-08-29 10:29:09 +08:00
www.xueximeng.com
052206a133 docs(mpv): record P3 AudioTrack closure
Verification: P3 commit/tag identifiers recorded; upstream checkpoint validator passed with 0 errors and 0 warnings; git diff --check passed

Task-Guard: P3-CLOSEOUT
2026-08-29 09:42:02 +08:00
www.xueximeng.com
d82336bde5 feat(mpv): support DTS-HD MA AudioTrack carriers
Verification: focused Java unit test; locked prepare-only patch stack; two-ABI native build and ELF verification; Mobile arm64 Debug APK build/install; API 35 DTS-HD MA/TrueHD/E-AC3/AC3/LPCM pause-resume-seek PCM fallback matrix; AudioFlinger underruns=0

Task-Guard: P3
2026-08-29 09:40:14 +08:00
www.xueximeng.com
3cd32eea89 docs: close P2-2 verification record
Verification: P2-2 final commit/tag documentation closure; implementation ba47756d7e; recovery tag recovery/P2-2-MPV-DV7-METADATA-CODECPAR/20260829065811-ba47756d7e46

Task-Guard: P2-2-MPV-DV7-METADATA-CODECPAR
2026-08-29 07:01:21 +08:00
www.xueximeng.com
ba47756d7e mpv: complete DV7 HDR10 fallback codec metadata sync
Verification: P2-2 source adaptation; two-ABI native build/install; verify_mpv_native_assets.sh --require-elf; Mobile arm64 Debug APK 8c3f1d569d5b325d1e577a5a77d196c800c167159d76f313adc2c3bb02049a4c; APK asset identity; USB V2453A install/launch; user-confirmed DV7 and neighboring playback pass

Task-Guard: P2-2-MPV-DV7-METADATA-CODECPAR
2026-08-29 06:58:11 +08:00
www.xueximeng.com
14931888cf mpv: auto-route unsupported DV5 through Vulkan
Verification: MpvAutoRenderPolicyTest 6/6; assembleMobileArm64_v8aDebug successful; vivo V2453A DV5 automatic Vulkan gpu-next with hevc_mediacodec; ordinary HDR restored opengl/gpu; user confirmed normal

Task-Guard: P2-5-MPV-DV5-AUTO-VULKAN
2026-08-29 03:18:58 +08:00
www.xueximeng.com
b97a3cae8a fix(mobile): refresh subtitle action visibility
Verification: mobile arm64 debug Java compile and APK assemble passed; OEM-assisted install passed; MPV settings subtitle entry visible in device UI; user confirmed subtitle menu visible; no crash or ANR observed

Task-Guard: mobile-mpv-subtitle-menu-refresh
2026-08-29 02:18:03 +08:00
www.xueximeng.com
f85b9d3e9f merge: integrate verified player fixes into fongmi-sync
Verification: upstream checkpoint verification passed; verify_mpv_native_assets --require-elf passed; Mobile and Leanback arm64 debug builds passed; vivo V2453A candidate install, VideoActivity playback smoke, and fatal/ANR/seek-rejection log checks passed; original Exo and MPV task-level verification retained

Task-Guard: integrate-fongmi-sync-bugfix-20260829
2026-08-29 01:38:58 +08:00
www.xueximeng.com
5cdbd97e70 fix(mobile): dim inactive playback diagnostics icon
Verification: Mobile arm64 debug build passed; installed on vivo V2453A; inactive 30% appearance accepted by user

Task-Guard: mobile-osd-diagnostics-inactive-alpha
2026-08-29 01:06:03 +08:00
www.xueximeng.com
2156c74749 fix(exo): resolve deferred cues through chained seekheads
Verification: MatroskaExtractorNonParameterizedTest BUILD SUCCESSFUL; extractor publish BUILD SUCCESSFUL; Mobile/Leanback arm64 Java compile BUILD SUCCESSFUL; vivo V2453A Android 15 EXO repeated seek user-confirmed; artifact/module/lock checksums consistent

Task-Guard: E-SP2-CHAINED-SEEKHEAD
2026-08-29 00:43:52 +08:00
www.xueximeng.com
13a4ce3e47 docs: close P2-1 implementation record
Verification: implementation commit/tag recorded; checkpoint verifier, git diff --check, and task guard scope passed

Task-Guard: P2-1-DOC-CLOSURE
2026-08-29 00:39:27 +08:00
www.xueximeng.com
fe4184933f mpv: precompute generic Vulkan UV transforms
Verification: shader/SPIR-V contract; two-ABI native build; verify_mpv_native_assets --require-elf; mobileArm64 debug APK asset identity; vivo V2453A HDR10 hard-decode compute/fragment/legacy/stable/auto playback; user config restored

Task-Guard: P2-1-MPV-VULKAN-GENERIC-UV
2026-08-29 00:36:32 +08:00
Silent1566
24c83e436e Remove unused history startup resource
Verification: Targeted :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.AppBrandingContractTest BUILD SUCCESSFUL in 14s; unused startup_window_history resource removed after restoring both flavors to direct HomeActivity aliases
Task-Guard: delete-unused-history-startup
2026-08-29 00:21:04 +08:00
Silent1566
95dcc27718 Remove unused branding launch helpers
Verification: No references remain to BrandLauncherActivity, startup_window_current, or startup_window_history outside the intentionally retained final cleanup file; targeted :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.AppBrandingContractTest BUILD SUCCESSFUL in 26s
Task-Guard: delete-unused-brand-launchers
2026-08-29 00:17:04 +08:00
Silent1566
bedd7476aa Restore direct launcher aliases for app branding
Verification: Targeted :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.AppBrandingContractTest BUILD SUCCESSFUL in 46s; manifests restored to direct HomeActivity aliases and Theme.Splash, removing the extra launcher stage
Task-Guard: remove-brand-launcher-stage
2026-08-29 00:11:04 +08:00
Silent1566
9d5ebcad65 Make the mobile startup window follow the selected app icon
Verification: AppBrandingContractTest: tests=12 failures=0 errors=0; :app:testMobileArm64_v8aDebugUnitTest and :app:assembleMobileArm64_v8aDebug BUILD SUCCESSFUL in 24s; emulator-5554 history startup recorded as STARTUP-cube-tile for 12.6s with no BLACK frames; current startup recorded as STARTUP-MO-circle for 12.2s with no BLACK frames; preference and launcher restored to app_branding_icon=1/HomeActivityHistory; base leanback unrelated failures reproduced separately and unchanged
Task-Guard: brand-startup-window-mobile
2026-08-28 23:15:09 +08:00
Silent1566
6a9f305fb3 Make the leanback startup window follow the selected app icon
Verification: AppBrandingContractTest passed via :app:testLeanbackArm64_v8aDebugUnitTest and :app:assembleLeanbackArm64_v8aDebug BUILD SUCCESSFUL in 1m 7s; screenrecord frame timeline on emulator-5560 shows history mode launcher -> branded cube startup window 3.4s -> HOME with zero BLACK frames, default mode shows blue MO startup window (frame c025 verified visually); task stack after handoff contains only HomeActivity; pre-existing unrelated failures MpvPreloadControllerTest(2) MultiThreadProxyPlayerUiSourceTest(1) FfmpegVc1SupportTest(2) reproduce identically at base 0fdc0a4062 in a detached worktree
Task-Guard: brand-startup-window-leanback
2026-08-28 22:08:55 +08:00
Silent1566
e8ae1acb8d 合并:同步 beta 最新代码 2026-08-28 22:07:39 +08:00
Silent1566
db1ed49d2d 新增:猫源设置页支持导入导出,动作项点击直达不再闪播放页
导入导出:
CatWebActivity 缺 onShowFileChooser 与 DownloadListener,设置页的导入
(antd Upload → input type=file)和导出(a[href=/website/backup] +
Content-Disposition)都点了没反应。补上两个回调:导入复用仓库既有
FileChooser(TV 或无系统文件管理器时退到内置 FileActivity),导出交
DownloadManager 写公共下载目录并透传 UA 与 Cookie。取消、失败、页面销毁
都保证回一次 null,否则 input 会永久卡死。

不按 accept 过滤类型:页面给的是扩展名 .json,而列表里文件类型由
DocumentsProvider 按扩展名反推,两边有一边不认就会把用户要导入的文件藏起来。

动作项直达:
配置站点把设置入口伪装成点播条目,原先先开详情页、等 bundle 发
openInternalWebview 再退场,播放页必然被创建并闪一下。改为在
ContentDispatcher.dispatchSite 阶段分流(对齐音频源/小说源),
startActivity 之前就接管,详情页不再创建。

判定不写死动作名:老 bundle 只有 openInternalWebsite,新的又加了
builtinDanmuApiQr,写死名字等于每加一项都要改代码。改按「能否从 vod_pic
的 proxy 段解出目标地址」判定 —— bundle 在 category 里就把地址 base64
编进了 pic,detail 里 dispatch 的是同一个地址。范围收在配置站点内,
并靠 vod_id 形状排除「扫码配置」(它的 id 是 Math.random 的小数)。

地址取自服务端下发的 pic,故加同源校验:只放行与站点同 host 的地址,
防 userinfo 与后缀混淆。api 为回环时放行私有网段 —— 宿主用 127.0.0.1
访问本机 bundle,而 bundle 自报局域网 IP,字符串比对会误判成跨 host。

不调 detail 让 bundle 去 dispatch:详情结果会被缓存,命中缓存时不调
spider,那条消息永不再发,会变成点了没反应。CatAction 原有的事后判定保留,
覆盖历史/搜索/推送等入口。

验证:单测 31 项全绿;emulator-5554 实测「点击配置」「弹幕服务」均只有
一次 START 直指 CatWebActivity、详情页零命中,「扫码配置」仍进详情页看
二维码;导入 PUT /website/backup 成功、导出落盘 config.<date>.json 内容往返一致。
2026-08-28 22:02:09 +08:00
www.xueximeng.com
9fcab83f90 chore: simplify agent governance constraints
Verification: bash syntax, guard help, staged whitespace, review document presence
2026-08-28 19:12:02 +08:00
www.xueximeng.com
065951355f Merge verified Exo DV5 renderer into fongmi-sync
Preserve the completed P1 MPV native candidate while integrating the verified E9-3 Exo DV5 MediaCodec/Vulkan renderer. The only overlapping path was the upstream assessment index; its P1 and E9-3 completion states were reconciled.

Verification: P1 paths match fongmi-sync; E9-3 paths match integrate/p0-exo-dv5; :app:assembleMobileArm64_v8aDebug; upstream checkpoint verification passed.
2026-08-28 18:59:07 +08:00
www.xueximeng.com
0271d23310 docs: close P1 MPV correctness stage
Verification: git diff --check; upstream checkpoint verification; recorded implementation commit/tag and user multi-disc acceptance

Task-Guard: P1-MPV-FORMAT-SHADER-CORRECTNESS
2026-08-28 18:43:07 +08:00
www.xueximeng.com
a5971e3814 mpv: add P1 format and shader correctness fixes
Verification: bash -n scripts/build_mpv_native.sh; ordered 15-patch apply; --abi all --prepare-only; clean two-ABI compile/link/install with recorded final duplicate-check anomaly; bash scripts/verify_mpv_native_assets.sh --require-elf; Mobile/Leanback arm64 and Leanback armeabi-v7a Debug APK build; APK asset byte comparison; vivo API 35 arm64 MPV Vulkan/MediaCodec/AudioTrack smoke

Task-Guard: P1-MPV-FORMAT-SHADER-CORRECTNESS
2026-08-28 18:41:07 +08:00
www.xueximeng.com
d94d0ca5a2 Merge Exo DV5 renderer into P0 MPV baseline
Preserve the P0 MPV native baseline and its completed Exo stages while integrating the verified E9-3 DV5 MediaCodec/Vulkan renderer history. Resolve the assessment index by retaining completed P0-side statuses and adding the final E9-3 acceptance state.

Verification: :app:assembleMobileArm64_v8aDebug; MPV lock/assets unchanged from recovery/P0-MPV-NATIVE-BASELINE/20260828122150-98f872eed700; E9-3 files match exo-dv5; upstream checkpoint verification passed.
2026-08-28 18:25:56 +08:00
www.xueximeng.com
6a3ddd266a fix(exo): release DV5 surface before DV7 fallback
Verification: arm64 debug build succeeded; installed on V2453A; DV5-to-DV7 user acceptance passed; no Surface -22 or decoder init failure in focused log
Task-Guard: E9-3-dv7-surface-lifecycle
2026-08-28 18:06:05 +08:00
www.xueximeng.com
e6a0ee4390 fix(exo): decode Dolby Vision RPU pivot deltas
Verification: arm64 APK build passed; installed on V2453A; P5 Exo c2.qti.hevc.decoder run matchedFrames=2433 unmatchedFrames=0 expectedQueueDrops=0 renderFailures=0 malformedRpus=0
Task-Guard: E9-3-frame-rpu-match
2026-08-28 17:48:50 +08:00
Silent1566
6c3ee6863a feat: 搜索结果碎片补齐 TMDB 匹配关键词传递
Verification: app:testMobileArm64_v8aDebugUnitTest --tests TmdbDetailActivityLayoutTest + app:compileLeanbackArm64_v8aDebugJavaWithJavac (BUILD SUCCESSFUL, 114 tests 0 failures)
Task-Guard: tmdb-collect-fragment-keyword
2026-08-28 17:05:49 +08:00
Silent1566
0fdc0a4062 Show branded home logo on the first frame
Verification: AppBrandingContractTest passed via :app:testLeanbackArm64_v8aDebugUnitTest (BUILD SUCCESSFUL in 37s); leanback arm64 APK assembled and installed on emulator-5560; 24-frame cold-start burst in history mode shows blueMO=0 and white base from frame 04, default mode shows blueMO=26 from frame 03, no icon flip
Task-Guard: fix-branding-logo-first-frame
2026-08-28 17:04:53 +08:00
Silent1566
f4440eebe4 feat: 搜索关键词贯通 TMDB 自动匹配链路
Verification: app:testMobileArm64_v8aDebugUnitTest --tests TmdbDetailActivityLayoutTest --tests TmdbUIAdapterTest + app:compileLeanbackArm64_v8aDebugJavaWithJavac (BUILD SUCCESSFUL, 114 tests 0 failures)
Task-Guard: tmdb-search-keyword-propagation
2026-08-28 17:01:47 +08:00
Silent1566
03ca947c8a Remove unreliable custom app icon feature
Verification: AppBrandingContractTest passed via :app:testLeanbackArm64_v8aDebugUnitTest; BUILD SUCCESSFUL in 1m 14s. Full leanback APK build succeeded in 6m 6s at 16:15:21 and installed on emulator-5560; legacy mode=2 resolves to built-in Current alias, custom picker/shortcut references removed
Task-Guard: remove-custom-app-icon
2026-08-28 16:27:24 +08:00
Silent1566
d4db7ff0a6 feat: prioritize search keyword in TMDB fallback matching
Verification: app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.title.MediaTitleCacheTest --tests com.fongmi.android.tv.ui.helper.TmdbUIAdapterTest (BUILD SUCCESSFUL, 61 tests)
Task-Guard: tmdb-match-order
2026-08-28 16:26:39 +08:00
Silent1566
47dfbc44e2 feat: include search keyword in AI title prompt
Verification: app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.service.AiTitleExtractionServiceTest (BUILD SUCCESSFUL)
Task-Guard: tmdb-search-fallback
2026-08-28 15:51:36 +08:00
Silent1566
d754a567f3 Render branding icons as app-only circles
Verification: AppBrandingContractTest passed via :app:testLeanbackArm64_v8aDebugUnitTest; BUILD SUCCESSFUL in 57s. Fresh APK rebuilt at 15:01:44 and installed on emulator-5560; custom mode=2, built-in HomeActivityCurrent enabled, in-app logo verified with circular mask
Task-Guard: fix-branding-circular-in-app-logo
2026-08-28 15:08:33 +08:00
Silent1566
3ef3ab57bf 修复:NodeService 系统重启时补齐前台响应
Verification: gradlew :app:testMobileArm64_v8aUnitTest --tests NodeServiceForegroundTest BUILD SUCCESSFUL
Task-Guard: node-service-foreground-restart
2026-08-28 14:39:59 +08:00
Silent1566
d5f53f7f63 修复:TMDB 匹配对话框结果恢复按标题相似度排序
Verification: gradlew :app:testMobileArm64_v8aUnitTest --tests TmdbMatcherTest BUILD SUCCESSFUL (7/7)
Task-Guard: tmdb-search-similarity-sort
2026-08-28 14:39:58 +08:00
www.xueximeng.com
42f7f54cd0 docs: add MPV P1 format and shader decision packet
Verification: P1 assessment validation passed: git diff --check; upstream checkpoint verifier; task_guard check; unique P1 document/index/full-hash checks

Task-Guard: P1-MPV-FORMAT-SHADER-CORRECTNESS
2026-08-28 12:29:45 +08:00
www.xueximeng.com
98f872eed7 docs: close P0 MPV native baseline assessment
Verification: P0 MPV native baseline assessment and index update; no production code changed

Task-Guard: P0-MPV-NATIVE-BASELINE
2026-08-28 12:21:50 +08:00
Silent1566
87da7b0b25
Merge pull request #178 from Silent1566/release/v5.6.0-202608271039
修复发布构建的 Maven 仓库顺序
2026-08-28 12:20:46 +08:00
Silent1566
a9f7e5c007 修复:优先使用官方 Maven 仓库解析依赖
Verification: Local Gradle :app:dependencies --configuration mobileArm64_v8aDebugCompileClasspath passed (BUILD SUCCESSFUL, exit 0)
Task-Guard: release-build-maven-502
2026-08-28 11:57:03 +08:00
Silent1566
58230b01b6 docs(upstream): record E3-1b merge completion
Verification: checkpoint 53 is latest; E3-1b merge hash/tag, two parents, next E4-1 action, and changed-file diff check verified
Task-Guard: fongmi-sync-e3-final-record
2026-08-28 11:47:19 +08:00
Silent1566
88c9df7b9c Keep home logo aligned with branding
Verification: AppBrandingContractTest passed via :app:testLeanbackArm64_v8aDebugUnitTest; BUILD SUCCESSFUL in 54s. Emulator-5560 entry and refreshed home screenshots both show the square History icon for app_branding_icon=1
Task-Guard: fix-app-branding-logo-consistency
2026-08-28 11:29:05 +08:00
Silent1566
574665863e
Merge pull request #177 from Silent1566/release/v5.6.0-202608271039
发布 v5.6.0 正式包
2026-08-28 11:27:53 +08:00
Silent1566
9a8ce8d669
Merge pull request #176 from Silent1566/dev3
Dev3
2026-08-28 11:19:22 +08:00
Silent1566
8921e611b1 Update in-app logo with app branding
Verification: AppBrandingContractTest passed via :app:testLeanbackArm64_v8aDebugUnitTest; BUILD SUCCESSFUL in 44s. Emulator-5560 save verified: app_branding_icon=0, HomeActivityCurrent enabled, home screenshot shows MO logo
Task-Guard: fix-app-branding-in-app-logo
2026-08-28 11:13:11 +08:00
Silent1566
dbf5189c19 fix: keep unknown playback duration unset
Verification: RED: VideoActivityLayoutTest.playbackHistoryKeepsUnknownDurationUntilMediaReportsOne failed on setDuration(0); GREEN: :app:testMobileArm64_v8aDebugUnitTest --tests VideoActivityLayoutTest passed after removing unknown-duration-to-zero writes in mobile/leanback VideoActivity
Task-Guard: playback-zero-duration-20260828
2026-08-28 10:40:13 +08:00
Silent1566
130eac99f7 merge(upstream): record fongmi-sync E3-1 closeout provenance
Verification: ours merge preserved the verified WebHTV tree; fongmi-sync head recorded as second parent; merge preparation document diff passed
Task-Guard: fongmi-sync-merge-closeout
2026-08-28 09:32:39 +08:00
Silent1566
1cf029bc77 docs(upstream): close out E3-1b fongmi-sync integration
Verification: E3-1b closeout documents record local commit/tag, upstream head, merge-tree caveat, and two-parent ours boundary; changed-file git diff check passed
Task-Guard: fongmi-sync-e3-closeout
2026-08-28 09:24:39 +08:00
Silent1566
55d1e7cbef Localize branding icon-only copy
Verification: AppBrandingContractTest passed via :app:testLeanbackArm64_v8aDebugUnitTest; BUILD SUCCESSFUL in 3m 46s
Task-Guard: localize-branding-icon-copy
2026-08-28 09:12:53 +08:00
Silent1566
b75ba0a5ca build(exo): finalize E3-1b DTS 14-bit publication
Verification: E3-1b artifact bytes, module embedded hashes, all sidecars, patch lock, script syntax, whitespace, and git diff check passed
Task-Guard: fongmi-sync-e3-1b-dts
2026-08-28 09:06:23 +08:00
www.xueximeng.com
eb5f7af998 Fix Exo DV5 renderer output color contract
Verification: arm64 APK build succeeded; installed on V2453A; P5_Dolby_Amaze Exo c2.qti.hevc.decoder path remained active; SurfaceFlinger video layer is V0_SRGB with no focused render failure or MPV switch
Task-Guard: E9-3-color-input
2026-08-28 07:40:16 +08:00
www.xueximeng.com
08ea167c3e fix(exo): retain DV5 RPU metadata through codec pre-roll
Verification: arm64 assemble BUILD SUCCESSFUL; V2453A P5 playback renderedFrames=2450 renderFailures=0 rpuQueueDrops=0; git diff --check and upstream checkpoint verification passed
Task-Guard: E9-3f-rpu-timestamp
2026-08-28 03:31:22 +08:00
www.xueximeng.com
250386c19a exo: signal DV5 Vulkan output as HDR10 PQ
Verification: JDK 21 :app:externalNativeBuildMobileArm64_v8aDebug BUILD SUCCESSFUL; :app:assembleMobileArm64_v8aDebug produced SHA-256 75d7cee2f3da73133ed8be65ab7ba184a4e4518ac9cecfd0ede17acab51b238b; V2453A logcat source/target BT.2020 PQ 10-bit with no render failure; SurfaceFlinger video dataspace BT2020_PQ
Task-Guard: E9-3e-hdr-swapchain
2026-08-28 01:19:43 +08:00
Silent1566
d1e19779f7 Remove app name input from branding editor
Verification: leanback AppBrandingContractTest BUILD SUCCESSFUL; branding layout and zh-CN copy are icon-only with app_name fixed to 默影视
Task-Guard: remove-branding-name-input
2026-08-28 00:49:32 +08:00
www.xueximeng.com
eb1f827bfc fix: preserve ordered DV5 RPU metadata for Exo renderer
Verification: arm64 APK build succeeded; target device Exo DV5 playback reached first frame at 963ms and rendered at 58.824fps; user reports near-black color remains
Task-Guard: E9-3d-render-fix
2026-08-28 00:45:39 +08:00
Silent1566
51e831c4ea 合并:同步 beta 最新代码 2026-08-28 00:37:13 +08:00
Silent1566
da7a7243ee Fix app branding to use a fixed name
Verification: leanback and mobile AppBrandingContractTest BUILD SUCCESSFUL; both launcher aliases now use app_name; custom icon selection preserved
Task-Guard: fix-app-branding-fixed-name
2026-08-28 00:36:48 +08:00
Silent1566
ceafe0b6c5 fix: validate lab process identity after restart 2026-08-27 23:57:03 +08:00
Silent1566
9ea2b091da Gate legacy shortcut fallback to pre-O
Verification: leanback AppBrandingContractTest BUILD SUCCESSFUL after red-green API gate; emulator-5560 logcat proved INSTALL_SHORTCUT broadcast is not delivered on Android 9
Task-Guard: fix-app-branding-shortcut-support-gate
2026-08-27 23:45:18 +08:00
Silent1566
23dd207994 Grant legacy launcher shortcut permissions
Verification: leanback AppBrandingContractTest BUILD SUCCESSFUL; assembleLeanbackArm64_v8aDebug BUILD SUCCESSFUL; emulator-5560 granted INSTALL_SHORTCUT and UNINSTALL_SHORTCUT; Android 9 logcat confirmed INSTALL_SHORTCUT broadcast is no longer delivered
Task-Guard: fix-app-branding-legacy-permission
2026-08-27 23:29:00 +08:00
Silent1566
22c7146ea8 Add legacy launcher shortcut fallback for app branding
Verification: leanback AppBrandingContractTest BUILD SUCCESSFUL; legacy fallback compiles and source contract confirms INSTALL_SHORTCUT name broadcast path
Task-Guard: fix-app-branding-launcher-name
2026-08-27 22:41:26 +08:00
Silent1566
b0b9d53c68
Merge pull request #175 from Silent1566/dev3
修复:炫彩详情重复播放时释放 PlaybackService
2026-08-27 22:33:04 +08:00
Silent1566
6126901f40 合并:同步 beta 最新改动 2026-08-27 22:20:32 +08:00
Silent1566
61c831e62a 修复:推送详情重复进入播放页时恢复选集
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.VideoActivityLayoutTest (BUILD SUCCESSFUL); :app:assembleMobileArm64_v8aDebug (BUILD SUCCESSFUL); emulator-5558 real push twice: second VideoActivity retained episode card and owner=true
Task-Guard: push-detail-preselected-flag
2026-08-27 21:53:52 +08:00
Silent1566
fe1c1eb56f
Merge pull request #174 from Silent1566/dev1
新增:社区音频指纹规则接入 + 去广告设置独立成页
2026-08-27 21:47:54 +08:00
Silent1566
3ef5a42e3b 修复:评审发现的规则下载安全与交互问题
- https 降级防护此前是无效的。实测 followSslRedirects(false) 仍会跟随
  https→http 的 302,而只检查最终 URL 已经太晚——明文那一跳请求已经
  发出,中间人拿到请求就能返回任意规则。改为关闭自动重定向、手动逐跳
  跟随,在发出每个请求之前校验协议,并限制最多 5 跳。判定逻辑抽成
  nextRedirect 便于直接单测。
- test.adStartMs + durationMs 会溢出回绕成负数,绕过安全整数上限检查。
  改为先卡 adStartMs 再做减法比较。
- 导入格式分流用 json.contains("ad-audio-probe-rules") 判断,而 v2 的
  规则 id 是自由字符串,一个 id 恰好等于该值的合法 v2 文件会被误判成
  v1 而整包拒绝。改为只扫顶层 format 键。
- 立即刷新时若已有刷新在跑,refreshNow 直接返回且无回调,UI 置上的
  「正在刷新」会永久卡住。改为返回 boolean,调用方据此复位。
- 规则源为空是「已关闭」而非配置错误,此前会把内部英文消息弹给用户。
  新增 onDisabled 回调与对应三语文案。
- 手机端刷新成功后多调了一次 setText(),会用刷新前的 revision 覆盖掉
  「正在刷新」,闪一下旧值;loadSnapshots() 自己会 post 刷新。

测试同步修正:此前测试用的 OkHttpClient 是默认配置(followRedirects
为 true),不反映生产行为,重定向相关断言因此失去意义。
2026-08-27 20:57:25 +08:00
www.xueximeng.com
3ab9dc97b9 Merge branch 'fongmi-sync-bugfix' into fongmi-sync
Reconcile E-SP3 App and Media3 fixes with the existing E4/E6/E7 fongmi-sync artifacts.
2026-08-27 20:34:55 +08:00
www.xueximeng.com
945366ade9 docs: record E-SP3 merge into fongmi-sync
Verification: E-SP3 App and Media3 merge commits recorded in index; prior targeted tests and full arm64 assemble passed

Task-Guard: E-SP3-MERGE-RECORD
2026-08-27 20:34:26 +08:00
www.xueximeng.com
c9d3bd912b media3: merge HLS pre-cache safety with fongmi-sync artifacts
Verification: AAR/source archive diff limited to PreCacheHelper HLS safety; lock hashes and all sidecars match; --no-build-cache --rerun-tasks :app:assembleMobileArm64_v8aDebug BUILD SUCCESSFUL

Task-Guard: E-SP3-MERGE-MEDIA3
2026-08-27 20:29:29 +08:00
www.xueximeng.com
38a4fdb84f docs: record E9-3 DV5 device render failure
Verification: device logcat proves MediaCodecVideoRenderer-DV5-Vulkan selected; ERROR_CODE_VIDEO_FRAME_PROCESSING_FAILED with AudioTrack initialized; git diff --check and checkpoint verifier passed
Task-Guard: E9-3d-device
2026-08-27 20:15:07 +08:00
www.xueximeng.com
17f1a4cfe2 exo: merge E-SP3 seek recovery fixes
Verification: :app:testMobileArm64_v8aDebugUnitTest AutoLoadControlTest ExoPlaybackThresholdCoordinatorTest PreCachePolicyTest BUILD SUCCESSFUL

Task-Guard: E-SP3-MERGE-APP
2026-08-27 20:05:37 +08:00
www.xueximeng.com
4ab8385921 Docs: record E7-2 C3 completion
Verification: E7-2/C3 implementation commit and recovery tag recorded; documentation diff check passed

Task-Guard: E7-2-C3-record
2026-08-27 19:38:14 +08:00
www.xueximeng.com
5f7d834bfd Exo: support ISO UDF multi-extent files
Verification: Media3 affected modules and Mobile/Leanback arm64 App Java compilation passed; no tests run per user instruction

Task-Guard: E7-2-C3
2026-08-27 19:36:29 +08:00
Silent1566
4edb499469 Add app branding settings entries
Verification: leanback and mobile AppBrandingContractTest BUILD SUCCESSFUL; TV and mobile personal-setting entries compile against the shared AppBrandingActivity; prior emulator-5560 verification confirmed history alias startup and custom title
Task-Guard: finish-app-branding-entry
2026-08-27 19:34:52 +08:00
www.xueximeng.com
5d6ea64e71 docs: record Android resource cache recovery
Verification: :app:processMobileArm64_v8aDebugResources rebuilt without build cache; normal :app:assembleMobileArm64_v8aDebug BUILD SUCCESSFUL; APK sha256 da1514a4e826cd8a363051c615bb89ca44d49d861088dcf9acb3f7987ff0c46d
Task-Guard: E-SP3-BUILD-RESOURCES
2026-08-27 19:33:38 +08:00
www.xueximeng.com
c943d7659b Wire experimental Exo DV5 Vulkan renderer
Verification: JDK21 Gradle :app:compileMobileArm64_v8aDebugJavaWithJavac succeeded; task_guard check and git diff --check passed
Task-Guard: E9-3d-optin
2026-08-27 19:24:41 +08:00
www.xueximeng.com
e1504ace74 exo: isolate user seek from rebuffer telemetry
Verification: bash gradlew --offline --no-daemon :app:clean :app:compileMobileArm64_v8aDebugJavaWithJavac; user vivo repeated seek acceptance
Task-Guard: E-SP3-SEEK-METRICS
2026-08-27 19:15:41 +08:00
www.xueximeng.com
7f573dab82 Prepare Exo DV5 Vulkan renderer admission telemetry
Verification: JDK21 Gradle app Java compile plus arm64-v8a and armeabi-v7a external native builds succeeded; git diff --check passed
Task-Guard: E9-3d-wiring
2026-08-27 19:15:29 +08:00
www.xueximeng.com
190b7751e4 Implement Exo DV5 Vulkan/libplacebo renderer path
Verification: JAVA_HOME=JDK21 bash gradlew :app:externalNativeBuildMobileArm64_v8aDebug :app:externalNativeBuildMobileArmeabi_v7aDebug --no-daemon; both ABI native builds succeeded; git diff --check passed
Task-Guard: E9-3d-vulkan
2026-08-27 19:05:21 +08:00
www.xueximeng.com
038b6c58b2 exo: use seek-specific playback recovery threshold
Verification: 17 targeted unit tests passed; :app:compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL
Task-Guard: E-SP3-SEEK-FIX
2026-08-27 19:00:55 +08:00
www.xueximeng.com
0d2f80fb3a exo: add seek recovery timing diagnostics
Verification: mobileArm64_v8aDebug BUILD SUCCESSFUL; APK installed; three seek traces captured in /tmp/e-sp3-3seek-app-debug.log
Task-Guard: E-SP3-DIAG
2026-08-27 18:15:06 +08:00
www.xueximeng.com
3df132a68e exo: vendor libplacebo renderer headers batch two
Verification: Minimal libplacebo renderer/Vulkan transitive public header closure copied from locked API 375 source; missing include scan empty; git diff check passed
Task-Guard: E9-3d-headers-b
2026-08-27 17:54:15 +08:00
www.xueximeng.com
7e2b6ecf33 exo: vendor libplacebo renderer headers batch one
Verification: Exact libplacebo 7.375.0 public header batch copied repository-locally; git diff check passed
Task-Guard: E9-3d-headers-a
2026-08-27 17:51:52 +08:00
www.xueximeng.com
f2c7d35675 exo: route DV5 RPU metadata into native renderer
Verification: Media3 Java compilation succeeded; arm64-v8a and armeabi-v7a native builds succeeded; Annex-B and length-prefixed RPU scanner tests added; git diff check passed
Task-Guard: E9-3c-renderer
2026-08-27 17:38:20 +08:00
www.xueximeng.com
fc78169728 exo: vendor libdovi parser closure for DV5 renderer
Verification: libdovi header generated by cbindgen 0.29.4; SHA-256 manifest matched; arm64-v8a and armeabi-v7a externalNativeBuild succeeded
Task-Guard: E9-3c-libdovi
2026-08-27 17:21:39 +08:00
www.xueximeng.com
e4f8327427 docs: record DV5 libdovi renderer gate
Verification: documentation records successful isolated libdovi builds for both Android ABIs and the remaining libplacebo metadata ABI gate; git diff --check passed
Task-Guard: E9-3c-render
2026-08-27 16:50:34 +08:00
www.xueximeng.com
9ab038c91a Docs: record E7-1 completion
Verification: E7-1 implementation commit and recovery tag recorded in the unique task document and master assessment; git diff --check and task guard check passed

Task-Guard: E7-1-record
2026-08-27 16:01:39 +08:00
www.xueximeng.com
491a7def30 Exo: harden ISO reader boundaries
Verification: E7-1 IsoDataReaderTest and datasource compile/publication BUILD SUCCESSFUL in 1m37s; Mobile and Leanback arm64 Debug Java compile BUILD SUCCESSFUL in 39s; patch/AAR/sources/module/POM SHA-256 locked; jq, git diff --check, and task guard check passed

Task-Guard: E7-1
2026-08-27 16:00:11 +08:00
www.xueximeng.com
893a2cca7b exo: vendor DV5 libplacebo native closure
Verification: two-ABI Gradle externalNativeBuild succeeded; MANIFEST.sha256 verified all four archives; git diff --check passed
Task-Guard: E9-3c
2026-08-27 15:47:09 +08:00
Silent1566
783bfbdce5 Merge remote-tracking branch 'origin/beta' into dev1 2026-08-27 15:42:33 +08:00
Silent1566
3f75aa4bd5 新增:社区音频指纹规则接入 + 去广告设置独立成页
接入上游 0o755/m3u8-ad-audio 社区规则库。实测其 spectral-sequence-v1
与本项目 spectral-sequence-v2 指纹格式一致(位布局、帧数公式、相位偏移
均已验证),故只做格式转换,不引入上游 SDK——后者会另起一个 audio-only
ExoPlayer 提前解码,音视频复用的 TS 分片需整片下载,多一份流量。

- ProbeRuleCodec:Probe Rules v1 严格解析并转 v2。相位 0 映射主指纹,
  64/128/192 映射变体;帧数须等于 floor((anchor-phase-512)/256)+1;
  前八帧区分度不足或跨规则前缀冲突则整包拒绝,不静默跳过单条规则。
- ProbeRuleStore:独立缓存槽,只接受更高 revision,同 revision 内容不同
  报发布冲突并保留旧缓存,先落临时文件解析成功后才原子替换。
- ProbeRuleDownloader:规则源无签名,传输层是唯一真实性保障,故不复用
  OkHttp.client()(它为兼容资源站装了 trust-all 证书与恒真 hostname
  校验),改用平台默认 TLS 并禁止 https 降级;4 MiB / 45s 上限,
  支持 304,失败 fail-open 保留旧缓存。
- 手动导入同时接受 v1 与 v2,落盘统一规范化成 v2。
- PlayerManager 规则源换成 PrioritizedAdAudioRuleSource(本地优先,
  社区源仅在本地为空时补位),此前该类从未被构造。

去广告设置从播放器页、增强页、AI 页迁出,合并为专属「去广告」页(两端
各 13 个条目 4 个分组)。顺带补齐手机端缺失的音频指纹入口,并给此前无
UI 的 ad_audio_auto_skip_enabled 接上开关。

修复文案:英文档位 100 条中文残留补译(站点匹配关键词如 [音][短] 属数据
故保留);zh-rTW 六处简繁误转「覈」改回「核」;ad_feedback_ai_disabled
指向已迁移的旧页面;总开关译名与「AI 智能去广」撞车,改为「去广告」。
2026-08-27 15:42:10 +08:00
www.xueximeng.com
fa9e8da831 Docs: record E6-1 completion
Verification: E6-1 implementation commit and recovery tag recorded in the unique task document and master assessment; git diff --check and upstream checkpoint verifier passed

Task-Guard: E6-1-record
2026-08-27 14:52:27 +08:00
www.xueximeng.com
0a8ed3b910 Exo: bound cache writer requests
Verification: Media3 10-patch replay and diff check passed; CacheWriterTest plus datasource/exoplayer compile and datasource publication BUILD SUCCESSFUL in 3m45s; patch/AAR/sources/module/POM SHA-256 verified; Mobile and Leanback arm64 Debug Java compile BUILD SUCCESSFUL in 38s; jq, git diff --check, and upstream checkpoint verifier passed

Task-Guard: E6-1
2026-08-27 14:50:43 +08:00
Silent1566
5120990035 Fix app branding runtime updates
Verification: leanback and mobile AppBrandingContractTest BUILD SUCCESSFUL; assembleLeanbackArm64_v8aDebug BUILD SUCCESSFUL; emulator-5560 final APK shows HomeActivityHistory enabled/current disabled, resumed from history alias, title 测试名称, no crash logs
Task-Guard: fix-app-branding-runtime
2026-08-27 14:24:39 +08:00
www.xueximeng.com
c94ba7c946 feat(exo): add DV5 AImageReader diagnostic bridge
Verification: compileMobileArm64_v8aDebugJavaWithJavac; externalNativeBuildMobileArm64_v8aDebug; externalNativeBuildMobileArmeabi_v7aDebug; ELF/JNI/SONAME/DT_NEEDED checks passed; targeted ExoDv5GpuRendererTest Gradle task blocked before test execution by pre-existing processMobileArm64_v8aDebugResources missing Material/Media3 resources
Task-Guard: E9-3b
2026-08-27 14:14:24 +08:00
www.xueximeng.com
0250fd0129 docs: record unresolved Exo seek pause
Verification: E-SP3 unresolved device status and diagnostic next action recorded in unique task document
Task-Guard: E-SP3-FINAL
2026-08-27 13:35:49 +08:00
www.xueximeng.com
c67b1498a2 Docs: close E4-J1 integration record
Verification: Documentation records E4-J1 implementation commit, recovery tag, verified scope, artifact hashes, remaining risks, and next action

Task-Guard: E4-J1-DOC
2026-08-27 13:33:05 +08:00
www.xueximeng.com
af78e3b765 Exo: add Cue data contract
Verification: Media3 9-patch clean replay; lib-common Cue/Bundle/LetterSpacingSpan tests and Java compile passed; lib-common publish passed; Mobile and Leanback arm64 Debug Java compile passed; lib-extractor and lib-ui Debug Java compile passed; artifact and patch SHA-256 recorded

Task-Guard: E4-J1
2026-08-27 13:31:06 +08:00
www.xueximeng.com
7f665b7d85 feat(exo): add DV5 GPU mapping route policy
Verification: ExoDv5GpuMappingPolicyTest: JUnit 4.13.2 OK (9 tests); :app:compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; Android Gradle unit-test task blocked before tests by existing missing resource attrs/styles recorded in docs/E9-3-exo-dv5-vulkan-renderer.md
Task-Guard: E9-3
2026-08-27 13:19:10 +08:00
www.xueximeng.com
6f3ff527a5 docs: define Exo DV5 Vulkan renderer plan
Verification: 方案文档已完成;verify_upstream_checkpoint 与 git diff --check 通过。
Task-Guard: E9-3
2026-08-27 13:01:54 +08:00
Silent1566
c10670e2df build(exo): adopt fongmi-sync E3-1a Media3 artifacts
Verification: fongmi-sync E3-1a AAR/sources/module artifact sidecars and embedded module entries all matched; git diff --check passed
Task-Guard: fongmi-sync-e3-1a-artifact
2026-08-27 12:52:56 +08:00
www.xueximeng.com
f196acf784 docs(E-SP3): record implementation and device validation blocker
Verification: Documentation/index validation passed: verify_upstream_checkpoint.sh, git diff --check, E-SP3 commit/tag/hash references, and explicit APK resource-link blocker recorded
Task-Guard: E-SP3-DEVICE
2026-08-27 12:48:08 +08:00
www.xueximeng.com
97d02d72b1 publish(media3): ship HLS pre-cache request safety artifact
Verification: Media3 build successful (474 tasks); media3-exoplayer AAR sha256 485805506d44b739f3cd4bf179241f0322a3e52de6b29625c3133832eaa187ea; sources sha256 f378864ac3817fd95132268170e6c0ca6d3dc76f9a7eb09c51d60cb06027d442; source and bytecode contain Pre-cache download request unavailable guard; App compileMobileArm64_v8aDebugJavaWithJavac succeeded; unit test task blocked by pre-existing missing Material resource attrs in processMobileArm64_v8aDebugResources
Task-Guard: E-SP3-B-PUBLISH
2026-08-27 12:37:02 +08:00
Silent1566
13c1e29f63 docs(upstream): 同步 fongmi-sync JDK 21 构建要求
Verification: fongmi-sync JDK 21 documentation content applied; target docs contain no Android Studio/JBR/JDK17 requirements; git diff --check passed
Task-Guard: fongmi-sync-jdk21-docs
2026-08-27 12:15:12 +08:00
Silent1566
bd11b19fd7 修复:炫彩详情重复播放时释放 PlaybackService
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.TmdbDetailActivityLayoutTest.colorfulDetailDoesNotKeepPlaybackServiceBoundBetweenEpisodeLaunches (BUILD SUCCESSFUL)
Task-Guard: push-colorful-repeat-play
2026-08-27 12:03:28 +08:00
www.xueximeng.com
a007af32c8 fix(media3): contain preload request lifecycle race
Verification: git diff --check; patch applies cleanly to locked media3-exoplayer PreCacheHelper source; no repository build inputs changed yet.
Task-Guard: E-SP3-B
2026-08-27 11:36:37 +08:00
www.xueximeng.com
41b1276111 fix(exo): isolate preload across seeks
Verification: git diff --check; bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.player.exo.PreCachePolicyTest :app:compileMobileArm64_v8aDebugJavaWithJavac (BUILD SUCCESSFUL)
Task-Guard: E-SP3-A
2026-08-27 11:20:14 +08:00
Silent1566
1992b34016 Fix shared app branding editor across flavors
Verification: leanback and mobile AppBrandingContractTest both BUILD SUCCESSFUL; mobile processMobileArm64_v8aDebugResources passed after shared-layout fix
Task-Guard: fix-app-branding-shared-ui
2026-08-27 11:06:36 +08:00
www.xueximeng.com
742de1b08b docs: remove unrequested DV5 conversion assessment
Verification: git diff --check; E2-3 evaluation document absent; added index row absent; original E2-3 output-policy content retained
Task-Guard: E2-3
2026-08-27 11:04:53 +08:00
www.xueximeng.com
385687c0eb docs: record approved E-SP3 implementation plan
Verification: Assessment packet approved; implementation authority transferred to E-SP3 upstream unit.
Task-Guard: E-SP3
2026-08-27 11:01:05 +08:00
www.xueximeng.com
be0875be91 Docs: assess Exo DV5 output policy
Verification: git diff --check; upstream checkpoint verifier PASS; dovi_tool 2.3.3 profile5 RPU converted to profile8 with recorded hashes; no runtime code changed
Task-Guard: E2-3
2026-08-27 10:46:39 +08:00
Silent1566
702de7e9ba Add app branding launcher aliases and resources
Verification: :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.AppBrandingContractTest (BUILD SUCCESSFUL); test statically validates both product manifests and personal-setting layouts
Task-Guard: complete-app-branding-core
2026-08-27 10:42:19 +08:00
Silent1566
ecfc941461
Merge pull request #173 from Silent1566/dev1
优化:手机端网格卡片备注改为满宽居中渐变遮罩
2026-08-27 10:39:27 +08:00
Silent1566
bddbe64265
Merge pull request #172 from Silent1566/dev3
重构:猫源 Node 运行时拆为 :node 子进程,换源无需重启应用
2026-08-27 10:39:08 +08:00
Silent1566
516e72a6d8 Fix app branding launcher alias resolution
Verification: :app:testLeanbackArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.setting.AppBrandingContractTest (BUILD SUCCESSFUL); adb dumpsys package confirms aliases com.fongmi.android.tv.ui.activity.HomeActivityCurrent/History
Task-Guard: fix-app-branding-alias
2026-08-27 10:02:27 +08:00
www.xueximeng.com
a20a31a7c6 Docs: close Exo subtitle byte safety record
Verification: E4-1 implementation commit 9018f2b5c2 and recovery tag recovery/E4-1/20260827074736-9018f2b5c2b1 recorded; task and assessment documents updated; git diff --check passed; protected dirty paths preserved

Task-Guard: E4-1-doc
2026-08-27 07:52:00 +08:00
www.xueximeng.com
9018f2b5c2 Exo: harden subtitle byte and charset handling
Verification: E4-1 decoder/extractor targeted tests and module compilation passed; clean 8-patch replay passed; artifact/lock hashes and contents verified; Mobile/Leanback arm64 Debug Java compilation passed; three expanded-suite failures reproduced on the seven-patch baseline

Task-Guard: E4-1
2026-08-27 07:47:35 +08:00
Silent1566
b61a2c2829 优化:手机端网格卡片备注改为满宽居中渐变遮罩
把分类页与搜索结果网格卡片底部的备注标签(第15集 / 更新至…)从左下角的
不透明主题色药丸改成跨海报满宽、文字居中、由暗到透明的渐变遮罩,透出海报
画面同时保证文字可读。年份与站源角标保持原样,TV 端不改。

- 新增 shape_vod_remark_full.xml:angle=90 自底向上 black_80 → black_60 →
  transparent,centerY=0.75 把暗区抬到文字带高度,使 12sp 白字在亮海报上
  仍高于 4.5:1 对比度
- remark 锚点改为 layout_alignBottom=@id/image:原先的 layout_above=@id/name
  在片名为空(getNameVisible 返回 GONE)时会被 RelativeLayout 丢弃,满宽遮罩
  会跑到海报顶部压住年份/站源角标
- 文字阴影复用共享的 @style/Video.ContextText,不再内联一套;补
  includeFontPadding=false 收窄遮罩条高度
- 测试按几何与渐变色标计算文字带处的遮罩 alpha 并断言下限,而非钉死字面量;
  在 CI 的发布关键测试白名单中注册 VodAdapterLayoutTest

Verification: :app:testMobileArm64_v8aDebugUnitTest VodAdapterLayoutTest 4/4 通过(含对比度不变量测试,已用去掉 centerY 的变异验证证明其会失败);processMobile/processLeanbackArm64_v8aDebugResources 均通过
Task-Guard: vod-remark-full-width
2026-08-27 02:14:43 +08:00
Silent1566
07cce45717 merge(beta): 合并音频播放页修复并通过代码评审
Verification: First and second code reviews found no defects; git diff --cached --check passed; :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.ui.activity.AudioPlaybackStyleRoutingTest succeeded with BUILD SUCCESSFUL; mobile Java compilation completed
Task-Guard: beta-merge-review-20260827
2026-08-27 02:10:36 +08:00
Silent1566
99ff0f8b40 docs(upstream): close out E3-1a implementation record
Verification: verify_upstream_checkpoint.sh: 0 errors; task guard check passed; git diff --check passed; E3-1a status/index and implementation checkpoints synchronized
Task-Guard: E3-1a-closeout
2026-08-27 01:46:12 +08:00
Silent1566
7fa3585e44 格式:修正 NodeRuntime 和 NodeService 的缩进不一致
部分代码行使用了 3 空格或 7 空格缩进而非标准的 4 空格,
统一为 4 空格对齐。无逻辑变更。

验证:compileMobileArm64_v8aDebugJavaWithJavac + NodePortSelectionTest 通过
2026-08-27 01:45:44 +08:00
Silent1566
4d5127b609 build(exo): finalize Media3 publication metadata
Verification: module/POM/Maven metadata MD5-SHA1-SHA256-SHA512 sidecars matched; module embedded AAR/sources sizes and SHA-256 matched; metadata version present; git diff --check passed
Task-Guard: E3-1a-impl-metadata
2026-08-27 01:44:13 +08:00
Silent1566
137fee9817 build(exo): add Pixel E-AC3 JOC fallback guard artifacts
Verification: bash -n scripts/build_media_deps.sh; git diff --check; media-lock JSON/patch SHA-256 and AAR/sources MD5-SHA1-SHA256-SHA512 checks passed; sources JAR contains MediaCodecUtil.java
Task-Guard: E3-1a-impl
2026-08-27 01:40:23 +08:00
Silent1566
71af6962b0 Merge remote-tracking branch 'origin/beta' into dev3 2026-08-27 01:25:39 +08:00
Silent1566
a9adbbd965 优化:缩短端口探测轮询间隔 500ms→200ms
waitReady 和 boot.js 的 publish() 定时器都从 500ms 降到 200ms,
端口绑定后更快落盘、更快被检测到。总超时保持 45s 不变(90*500ms→225*200ms)。

验证:compileMobileArm64_v8aDebugJavaWithJavac + NodePortSelectionTest 通过
2026-08-27 01:21:58 +08:00
Silent1566
891830d144 修复:换源进度反馈 + Toast 线程崩溃 + waitReady 无反馈
1. notifyProgress 里的 Notify.show 在后台线程调用导致 Can't toast on a thread
   that has not called Looper.prepare(),异常传播到 start() 导致 stopService 和
   waitForProcessDeath 没执行,STARTING 永远卡住。改用 App.post() 切主线程。

2. waitReady 轮询 45 秒期间无任何进度反馈,用户看到加载中转圈卡死。首轮没探测到
   端口时发「等待服务就绪…」进度。

3. 换源时主进程侧进度(正在关闭旧猫源服务…/正在切换猫源…)通过 notifyProgress
   同时推通知栏 + toast + callback。

4. 新增 node_stopping / node_waiting 字符串(三语言)。

验证:compileMobileArm64_v8aDebugJavaWithJavac + NodePortSelectionTest 通过
2026-08-27 00:43:52 +08:00
Silent1566
daac1bd8aa 重构:猫源 Node 运行时拆为 :node 子进程,换源无需重启应用
nodejs-mobile 的 node::Start 不可进程内重入,导致换猫源时新源静默拿到旧源配置
(表现为「确定后没反应」且会把旧源站点存进配置)。改为把 Node 启动放到独立 :node
子进程的前台 Service(NodeService)里,换源时主进程 stopService 杀旧子进程再
startService 起新子进程,Node/V8 随进程销毁干净。

NodeRuntime 退为主进程侧协调层:启动子进程 Service、接收 Messenger 回报的
进度/端口/错误。端口探测逻辑(readPorts/freePort/waitReady)移至 NodeService,
测试同步指向新位置。

验证:compileMobileArm64_v8aDebugJavaWithJavac + NodePortSelectionTest 通过
2026-08-26 22:31:39 +08:00
Silent1566
582fa66e09 docs(upstream): E3-1a assessment complete - Pixel E-AC3 JOC guard decision packet
Verification: E3-1a assessment: upstream 1066f642 7-file diff verified, fork gap confirmed, FFmpeg eac3 fallback verified, Issue 3257 evidence captured, decision packet written
Task-Guard: E3-1a-assessment
2026-08-26 22:26:52 +08:00
Silent1566
29839cfe10
Merge pull request #171 from Silent1566/dev1
修复:音频播放页顶部间距缺失、进入音频页先闪一下视频页
2026-08-26 22:05:57 +08:00
Silent1566
511accc002 修复:音频播放页顶部间距缺失、进入音频页先闪一下视频页
1. 顶部间距不对(与直播页一样高)
   applyStatusBarSpacer() 和 applyAudioStageInsets() 在 mobile VideoActivity
   里定义了却从未被调用,mStatusBarInset 永远是 0,audioStage 只吃到 XML 写死
   的 paddingTop=18dp,唱片封面被顶到状态栏底下。现在 setStatusBar 记录
   inset 并接上这两个方法,切换音频态时重算,与上游 fongmi-sync 的调用链一致。

2. 会先进入视频播放页再跳到音频播放页
   consumeImmersiveAudioLaunch() 挂在 onServiceConnected 上,要等播放服务绑定
   完成,中间几百毫秒会把视频详情页骨架先铺出来。改为在 initView 末尾用
   hasPendingImmersiveAudioLaunch() 探测待处理的沉浸式音频启动,探到就立刻立起
   audioStage,不再等服务绑定。该方法只读不消费缓存,旋转重建时不会误触发。

补充 AudioPlaybackStyleRoutingTest 源码不变量测试锁定第 2 项。
2026-08-26 22:00:08 +08:00
Silent1566
b15eaecb62 Merge remote-tracking branch 'origin/beta' into dev4 2026-08-26 21:50:38 +08:00
Silent1566
6312c485f0 finalize-E2-1-documentation-status
Verification: E2-1-final-doc-status-commit-and-tag-recorded-no-conflict-markers-git-diff-check-passed
Task-Guard: E2-1-doc-finalize
2026-08-26 21:20:48 +08:00
Silent1566
af28547d96 merge-upstream-E2-1-parser-safety-sync
Verification: JDK21-Mobile-Leanback-Java-BUILD-SUCCESSFUL-6m22s-five-LF-normalized-patch-hashes-and-four-artifact-hashes-match-lock-no-unmerged-paths-git-diff-check-passed
Task-Guard: E2-1-sync-closeout
2026-08-26 21:16:19 +08:00
www.xueximeng.com
cafd4f69e6 docs: standardize JDK 21 requirements
Verification: scoped documentation rg search found no JDK 17 or Android Studio/JBR references; git diff --check passed

Task-Guard: C-DOC-JDK21-CONSISTENCY
2026-08-26 20:37:10 +08:00
www.xueximeng.com
17b1006501 Docs: require standalone JDK 21 toolchain
Verification: Repository docs contain no Android Studio/JBR path references; README requires standalone JDK 21 and Android SDK command-line tools; diff check passed

Task-Guard: C-DOC-JDK21
2026-08-26 20:27:03 +08:00
www.xueximeng.com
d95bfd4df4 Docs: close E3-1b reproducibility record
Verification: Corrected zero-context patch handling, synchronized patch hash, recorded implementation commit/tag and next task E4-1; JSON and diff checks passed

Task-Guard: E3-1b
2026-08-26 20:25:03 +08:00
www.xueximeng.com
27b85eeeed Exo: correct DTS 14-bit frame sizes
Verification: JDK21 DtsUtilTest/lib-extractor compile BUILD SUCCESSFUL 7m45s; App Mobile/Leanback arm64 Debug Java compile BUILD SUCCESSFUL 4m56s; AAR/source ZIP and sidecar hashes verified; patch applies with --unidiff-zero to Media3 baseline; full release publish blocked by pre-existing MatroskaExtractor dirty checkout compile error

Task-Guard: E3-1b
2026-08-26 20:17:35 +08:00
Silent1566
1e96933f5f build(exo): 更新 Media3 extractor parser-safe 产物
Verification: 15 upstream-normalized extractor blobs; AAR/sources/module/POM MD5/SHA1/SHA256/SHA512; extractor lock override; git diff --check
Task-Guard: E2-1-sync-extractor
2026-08-26 19:05:57 +08:00
Silent1566
f2db5952eb build(exo): 更新 Media3 container parser-safe 产物
Verification: 15 upstream-normalized container blobs; AAR/sources/module/POM MD5/SHA1/SHA256/SHA512; lock JSON; git diff --check
Task-Guard: E2-1-sync-container
2026-08-26 18:59:25 +08:00
Silent1566
c9ddcf2bbd build(exo): 接入 HDR parser safety 补丁
Verification: normalized patch blob matches upstream; LF SHA-256 matches media-lock.json; JSON parse; bash -n; git diff --check
Task-Guard: E2-1-sync-parser
2026-08-26 18:46:21 +08:00
www.xueximeng.com
9c347cc688 Docs: mark E3-1a fully closed
Verification: E3-1a task status corrected to implemented and documentation closure complete

Task-Guard: E3-1a
2026-08-26 18:14:30 +08:00
Silent1566
f219599a87 docs(upstream): 记录 E2-1 fongmi-sync 合并决策
Verification: checkpoint verifier; E2-1 target/link checks; git diff --check
Task-Guard: E2-1-sync-assessment
2026-08-26 18:03:09 +08:00
www.xueximeng.com
b875252a5f Docs: close E3-1a integration record
Verification: Documentation closure: E3-1a commit/tag and next task E3-1b recorded; diff check passed

Task-Guard: E3-1a
2026-08-26 17:59:43 +08:00
www.xueximeng.com
cda1ac8cf2 Exo: guard Pixel E-AC3 JOC codec fallback
Verification: MediaCodecUtilTest Google/Samsung manufacturer cases; :lib-exoplayer:testDebugUnitTest; :lib-exoplayer:compileDebugJavaWithJavac; media3-exoplayer AAR/sources publish; app Mobile/Leanback arm64 Debug Java compile; git diff --check; media-lock JSON validation

Task-Guard: E3-1a
2026-08-26 17:56:58 +08:00
Silent1566
8951225da0
Merge pull request #170 from Silent1566/dev2
修复:猫源四处缺陷——端口误认、设置页跳浏览器、换源无反应、TMDB 排除规则漏猫源
2026-08-26 16:41:56 +08:00
Silent1566
09af6a0069 Merge remote-tracking branch 'origin/beta' into dev2 2026-08-26 16:34:48 +08:00
Silent1566
4c95607710 修复:猫源四处缺陷——端口误认、设置页跳浏览器、换源无反应、TMDB 排除规则漏猫源
一、订阅无效:App 连到了 bundle 内附带的弹幕服务器

魔改 bundle 会在同一 Node 进程起多个 HTTP 服务(豆儿源 2 个、lmentor 源 3 个)。
boot.js 原先只把第一个 Server 句柄的端口落盘,句柄顺序不保证猫源在前——实测落到了
弹幕服务的 9321,而猫源在 9988。取配置吃 401 信封,全链路无一环报错:
waitReady 只判「响应非空」(401 信封是非空的)→ normalize 原样返回 → checkJson 只认
msg 键(信封用的是 errorMessage)→ initSite 拿到空 sites。表现为「订阅无效」且无提示。

- NodeBoot:落盘全部候选端口,指定端口排首位;先写 .tmp 再 rename,避免 Java 侧读到
  半截端口号;持续轮询到目标端口出现(附带服务可能晚 6 秒才绑定),候选集未变则不重写。
- NodeRuntime:readPort 改 readPorts 解析候选列表(兼容单端口旧格式、坏分片跳过),
  waitReady 每轮重读文件并逐个探测,只采纳校验通过的端口。
- CatSource:新增 isConfig 按配置形状判定(sites / video.sites / 非空站点数组),
  401 信封与欢迎页都不算;新增 reject 抛出服务端原话,判定收窄到「有 errorMessage 且
  无任何配置内容」以免误伤仓库配置;base 改纯字符串解析,去掉 android.net.Uri 依赖。

二、设置中心跳外部浏览器,且背后压着空白详情页

猫源配置站点把设置入口伪装成点播条目,点它时 bundle 请求宿主开网页、detail 返回含一个
全空条目的列表——列表非空,详情页照常打开。openInternalWebview 原先落到 ACTION_VIEW。

- 新增 CatWebActivity 内嵌渲染(参照 PeekPro 的 flutter_inappwebview 做法)。渲染远程
  页面,所以不注册任何 JS 桥;开 JS 与 DOM storage(设置页是 React 应用),关文件访问;
  http(s) 导航留在本页,其余 scheme 丢弃;返回先回退再关页。
- CatWebview:改为直接在 Nano 工作线程 startActivity,不经主线程队列——请求到达时详情页
  正在启动播放服务,队列实测排过 27 秒,导致设置页姗姗来迟。内嵌失败才退回系统浏览器。
- 新增 CatWebEvent 携带请求时刻,详情页据此立刻退场,不等那份可能被堵住 7.7 秒的结果。
- 新增 CatAction 兜底判定:条目什么都没有 + 站点是猫源 + 本次导航确实请求过开页。
  三个条件都要,少了最后一条会让坏掉的 spider 对真片源返回空对象时静默关页。
- SiteApi:不再缓存「什么都没有」的详情——命中缓存会跳过 spider,而开页的副作用就发生
  在 spider 调用里,于是第二次点击网页再也不开。
- 三个详情入口都让位:TmdbDetailActivity 与两个 flavor 的 VideoActivity。leanback 的
  判定必须排在「等播放服务」的早退之前,否则重投时归属判定已失配。

三、换猫源确定后没反应

Node 单进程只能启动一次。start 发现已在运行时直接回旧服务地址、忽略新 URL,于是新源
静默拿到旧源配置,还把旧源的 home 存进新配置行。改为记住 servingUrl,换 bundle 就如实
失败并提示重启(判据用 LAUNCHED,它才涵盖「起过但没就绪」「起来后又退了」这些中间态)。

四、TMDB 默认排除规则对猫源一条也匹配不上

默认规则写半角 [音],而猫源站点名一律全角「音」,57 个站点无一命中,连配置站点都会拉
TMDB。TmdbConfig 匹配时归一化括号(「」【】〔〕[]→ []),并把配置站点 [设] 加入默认。

验证

- 新增 6 个测试类共 46 项,断言用的是从设备抓下来的真实 401 载荷与真实配置。
- 生成的 boot.js 过 node --check;本机 Node 复现「弹幕先绑、猫源晚 800ms」,候选落盘
  9988,9321 且猫源首位,写文件 2 次(原先最多 60 次)。
- 模拟器 5556 实测:两个不同猫源各连测多轮,设置页在 App 内打开、返回落回来处、详情页
  彻底出栈、无一次缓存命中;换源给出提示且不再产生污染配置行。
- 全量 2977 项,5 个失败与干净树同一批(Mpv/Ffmpeg/Proxy 既有失败)。

Html 测试桩补双参 fromHtml 重载与 FROM_HTML_MODE_LEGACY(Vod.getName 需要)。

已知未解:换源仍需手动重启;NodeBundle 缓存不按源区分,多源来回切会互相覆盖。
2026-08-26 16:32:32 +08:00
Silent1566
cde36a6d5d
Merge pull request #169 from Silent1566/dev1
修复:沉浸融合内嵌状态切小窗显示整页缩放
2026-08-26 15:52:55 +08:00
www.xueximeng.com
c410bf4f40 docs: close E2-1 implementation record
Verification: E2-1 task record and assessment index reference implementation commit e19289a3c9 and recovery tag; task guard scope check and git diff --check passed

Task-Guard: E2-1-doc-closeout
2026-08-26 13:31:17 +08:00
www.xueximeng.com
e19289a3c9 exo: harden HDR and Dolby Vision parser safety
Verification: JDK21 Media3 targeted tests passed; five-patch replay passed; lib-container/lib-extractor release AARs published; Mobile and Leanback arm64-v8a Debug Java compilation BUILD SUCCESSFUL in 42s; lock and artifact SHA-256 consistent

Task-Guard: E2-1-final
2026-08-26 13:29:16 +08:00
Silent1566
14c3418453 Merge remote-tracking branch 'origin/beta' into dev1 2026-08-26 11:37:58 +08:00
Silent1566
8f975086a6 修复:沉浸融合内嵌状态切小窗显示整页缩放
根因是 onPictureInPictureModeChanged 里铺满窗口的动作被 inlinePiPLayoutRequested
卡住。该标志只在 enterInlinePiP() 里赋值,而 Android 12+ 开了 setAutoEnterEnabled
后,按 Home / 上滑回桌面由系统直接把 Activity 送进 PiP,不走 enterInlinePiP();
更糟的是 onUserLeaveHint() 里那次 enterInlinePiP(false),此时已在 PiP 中,
PiP.enter() 直接返回 false,把标志按回 false。

结果 enterInlinePiPLayout() 一次都没执行,playerPanel 保持内嵌卡片布局
(252dp 高、左右 16dp 边距、20dp 圆角、描边),小窗里就把整页缩放着显示,
卡片圆角、FOCUS_STROKE 描边、背景图和标题文字全都露出来。先全屏再切小窗之所以
正常,是因为全屏时 playerPanel 已经是 MATCH_PARENT、圆角 0、描边 0,压根不需要
这次布局切换。

改动:
- onPictureInPictureModeChanged 无条件调 enterInlinePiPLayout(),覆盖 autoEnter、
  手势回桌面、按钮点击全部路径;全屏场景由方法内部 guard 拦住,行为不变。
- 删掉 inlinePiPLayoutRequested 字段及其三处赋值,这个标志本身就是 bug 源。
- enterInlinePiPLayout() 的 guard 补上 !inlineStarted,避免未起播时铺一块黑面板。

验证:模拟器实测内嵌起播后按 Home,回调到达时面板仍为 lp=-1x756/radius=60/
stroke=3,修复接手后变 lp=-1x-1/margin 全 0/radius=0/stroke=0,最终
measured 与 root 同为 576x324,面板严丝合缝铺满小窗。另埋 tripwire 确认 PiP
期间无任何代码把布局改回内嵌。TmdbDetailActivityLayoutTest、
DetailThemeVisibilityTest、BackgroundPlaybackPolicyTest、PipExitDecision 全绿。
2026-08-26 11:35:31 +08:00
Silent1566
75a2c0d4b4
Merge pull request #168 from Silent1566/dev2
Dev2
2026-08-26 09:50:06 +08:00
Silent1566
6a5d93cf48 修复:MPV 快进/拖拽后先卡画面才出加载中,seek 期间仍上报 READY
现象:MPV 内核下快进或拖拽进度后,加载动画不是立刻出现,而是先卡住画面,
之后才出加载中或直接续播。

根因是三条独立机制叠加:

1. `VideoActivity.onSeekStarted()` 在 seek 命令发出前就 `showProgress()`,
   所以拖拽瞬间其实是有加载动画的。同时它挂了个 500ms 的
   `mSeekProgressFallback = this::hideSeekProgressIfReady`。
2. `MpvPlayer.handleSeek()` 只在 `playbackState == STATE_ENDED` 时才置
   BUFFERING。播放中 seek 时状态是 READY,这行不生效,播放器对外一直宣称
   READY。
3. 500ms 到点,`hideSeekProgressIfReady()` 看到 READY 就把加载动画收掉,
   而 mpv 此时还在 demux/解码新位置,画面停在旧帧 —— 这就是「先卡画面」。

之后画面恢复的两条路正好对应两种结局:mpv 若来得及填上缓冲,
MPV_EVENT_PLAYBACK_RESTART 把状态置回 READY,画面直接续上;缓冲不够时
`paused-for-cache` 属性回调才置 BUFFERING,加载动画这时才第二次出现。
两条路都要等 mpv 的异步回调,所以延迟感明显。Exo 没这问题,它 seek 时
自己就切 BUFFERING,那个 500ms 检查看到 BUFFERING 便不动手。

顺带发现 `MPV_EVENT_SEEK`(值 20)在 `MPVLib.java` 早有常量定义,但
`MpvPlayer` 的事件 switch 里从未处理 —— mpv 自己的 seek 通知被完全丢掉。
mpv 官方语义正是 "a seek was initiated. Playback stops",恰是需要的窗口。

修法分层:

- `MpvPlaybackState` 新增 `resolveAfterSeekRequest`,与既有
  `resolveAfterCachePoll` 并列。IDLE 与 `stopping` 保持原状(无可 seek 之物 /
  不复活正在拆的会话),ENDED 转 BUFFERING(从末尾往回拖是要恢复播放)。
- `handleSeek` 接上该策略;`MPV_EVENT_SEEK` 作为第二个入口,覆盖 mpv 自己
  发起、不经 handleSeek 的 seek(章节跳转、EDL/loop)。两处都会在落进已开
  窗口时重挂截止时间,避免连续拖拽跑在第一次 seek 的旧 deadline 上;而由
  缓冲卡顿开的 BUFFERING 刻意不认领,那已计过一次重缓冲。
- 窗口出口:PLAYBACK_RESTART、`paused-for-cache` 转 READY、以及 15 秒超时
  兜底。超时兜底是必需的 —— `applyPausedForCache`/`refreshCacheState` 这条
  缓冲轮询自愈路径经全仓核对(含反射)无任何生产调用点,是死代码,指望不上。
  超时只在向 mpv 确认 `paused-for-cache` 为假后才改状态:若 mpv 确实还在等
  缓冲,BUFFERING 是诚实的,此时发布 READY 等于把转圈收在冻结画面上(正是
  本次要修的症状,只是推迟到 15s),且会让 `checkBufferingStall` 取消看门狗。
- 另在 set-media-items / START_FILE / end-file / ended / stop / fail 六处清
  窗口标志,避免遗留的超时在后续会话里误判。
- `PlayerManager.recordBufferingState` 把 seek 引起的 BUFFERING 从重缓冲统计
  中排除,照 `mpvHlsManagedReload` 已有的排除逻辑写。`PlaybackBufferingTracker`
  把 startup 之后每次 BUFFERING 都记一次 rebuffer,而该计数喂给网络保护与 HLS
  变体策略,不排除的话每次拖拽都会被当成吞吐下降。只丢进入沿,离开沿照旧,
  以免 tracker 的内部 buffering 布尔失步。

评审中撤销了一处自己先前的改动:`armBufferingStallWatchdog` 曾被加上
`isExo()` 门控,理由写的是「MpvPlayer 未覆写 getBufferedPosition()/isLoading(),
在 MPV 上会比两个永不移动的值」。该理由不成立 —— MPV 经 SimpleBasePlayer.State
发布了两者(`setIsLoading` 映射 `paused-for-cache`,buffered 端点来自 demuxer
cache 观察者),每秒 `invalidateState()` 都在推进。更关键的是 E-SP3 文档明确把
该看门狗设计成内核回退链的触发点,而链覆盖全部内核(KERNEL_ORDER = EXO → IJK
→ MPV → 系统),门控等于把 MPV/Ijk 从一条有意为之的链里摘掉,重新留出它本要
补的「转圈不消失且不回退」缺口。暂停误杀由 `checkBufferingStall` 的
`playWhenReady` 守卫负责,不该靠排除内核。已加断言钉住这一点。

时序核对:seek 超时 15s 早于看门狗的 20s(loading 时 60s),被吞的 seek 会先
解为 READY,`checkBufferingStall` 下一拍即取消看门狗,两者不会互相误触发。

线程:`super(Looper.getMainLooper())` 使 applicationLooper 即主 looper,
`handleSeek` 由 media3 保证在 app 线程,原生回调经 `postToMain` /
`mainHandler.postDelayed`,`seekBufferingActive` 全程主线程封闭。

验证:新增/修改用例 27 个全部真实执行(skipped=0)。三处变异验证均精确命中 ——
回退 `resolveAfterSeekRequest` 的 BUFFERING 分支令
`seekFromReadyReportsBufferingInsteadOfHoldingAFrozenFrame` 变红;把重缓冲排除
条件改成恒假令 `seekInducedBufferingIsExcludedFromTheRebufferCount` 变红;把
`isExo()` 门控加回去令 `stallWatchdogStaysKernelAgnostic` 变红。双 flavor 编译
通过;`androidx.media3.mpvplayer.*` 与 `com.fongmi.android.tv.player.*` 全量
1463 个用例仅 2 个失败,为 `MpvPreloadControllerTest` 的
`staleRevisionSessionAndOutOfOrderSamplesCannotReopen` 与
`lowRatioImmediatelyCancelsAllowedPreload`,已在干净的 `0aefb6bf98` worktree
上跑出同样两个失败,属预存问题。

未做实机验证:本次只跑了单测与编译,加载动画的实际观感待真机确认。
2026-08-26 09:30:31 +08:00
Silent1566
2a56751af0 修复:MPV 几乎所有片源报「加载媒体失败」,根因是两份 libc++ 撞 soname
现象:MPV 内核下大部分视频直接失败,统一弹「MPV 加载媒体失败」。
logcat 给出真正的错误:`MPV_LOAD_FAILED: dlopen failed: failed to link
libmpv.so` —— 是原生库链接失败,不是媒体问题。

那句文案本身有歧义,这也是排查绕远的原因:`error_play_mpv_load_failed`
不只代表媒体打不开,它同样是原生库加载失败的出口。`openCurrent()` 第一句就
调用 `ensureInitialized()`,其中 `MPVLib.ensureLoaded()` 失败抛 IOException,
被同方法的 `catch (Throwable)` 收走;此时没有任何 `sawXxx` 证据位,
`classifyLoadError` 落到兜底分支 ERROR_LOAD_FAILED,最终映射成这句话。
「每个片源都给同一句」正是一次原生加载失败被反复复现的特征。

根因链(逐环已验证):

`nodejs` 模块(`79bbb3e01d` 引入)用 `ndkVersion 28.2.13676358` 配
`-DANDROID_STL=c++_shared`,于是把 NDK 28 那份 libc++_shared.so 打进
APK 的 `lib/<abi>/` —— 链接器默认命名空间的搜索路径。而 MPV 预编译产物
锁定 NDK 29(`third_party/mpv-native-lock.json`)。用 llvm-nm 核对:
`libmpv.so` 有两个未定义符号 `std::__ndk1::__from_chars_floating_point
<double>/<float>`,NDK 29 那份导出(2 个),NDK 28 sysroot 那份导出 0 个。
soname 在一个命名空间内只解析到一份,被 NDK 28 占住后,MPV 即使按绝对
路径 `System.load` 自己那份也改不了 `libmpv.so` 的 DT_NEEDED 解析结果,
缺符号 dlopen 失败,`libplayer.so` 依赖它跟着失败。

为什么突然坏:此提交之前仓库里根本没有 libc++_shared.so(git 历史核对),
MPV 自带的 NDK 29 那份从 assets 解出后独占 soname,一切正常。nodejs 模块
一进来就往 `lib/<abi>/` 塞了个版本更低的同名库,把独占抢走了。与 MPV 自身
代码无关。

修法两处:

1. `nodejs` 改 `-DANDROID_STL=c++_static`。该 shim 只用到 17 个基础运行时
   符号(operator new/delete 与 __cxa_* 异常桩),静态链接体积代价很小。
   改后 `libcnode.so` 的 DT_NEEDED 只剩 liblog/libdl/libm/libc。
2. 把 NDK 29 那份签入 `app/src/main/jniLibs/<abi>/`。运行时下载的
   `libnode.so` 自身 DT_NEEDED 仍需要 libc++_shared.so,而 NDK 29 那份是
   三方符号需求的超集:libnode 需 120 个 C++ 符号、cnode 17 个、libmpv 138
   个,NDK 29 对三者均缺 0 个(libnode 唯一缺的
   `_ZTHN2v88internal12trap_handler21g_thread_in_wasm_codeE` 是 V8 的 TLS
   符号,由 libnode 自身解析,与 libc++ 无关)。

顺带修一处同域缺陷:`ensureInitialized()` 原先在 `mpvTryCreate()` 之前就
`nativeContextOwner = this`,创建失败抛异常时不回滚。而进接管分支时前一个
owner 已被置 released 并释放,没有别的地方会再重置它,于是进程级 owner 永久
指向一个 `initialized == false` 的死实例,之后每次播放都走接管分支去释放一个
从未创建的 context,反复失败直到重启 App —— 把单次失败放大成永久失败。改为
创建成功后才赋值,失败路径显式清 null。

验证:实机(模拟器 5556,mobile arm64,覆盖安装保留数据)确认修复有效,
三条独立证据 —— `/proc/<pid>/maps` 里 libmpv.so 与 libplayer.so 均已映射
(修复前正是这两个缺失),本次运行 dlopen 失败计数 0;应用内运行时信息显示
`decoder MPV mediacodec-copy`、`vo gpu / context android`、`A-V 0ms`;
播放位置 11 秒采样窗口内从 26.2s 推进到 37.3s,1:1 跟随真实时间。
双 flavor 编译通过。
2026-08-26 09:25:55 +08:00
Silent1566
452df45050
Merge pull request #167 from Silent1566/dev3
Dev3
2026-08-25 21:11:16 +08:00
Silent1566
511560d144 Merge remote-tracking branch 'origin/beta' into dev3 2026-08-25 20:54:27 +08:00
Silent1566
af919e625a 测试:详情直放控制栏防回归断言改钉首位,修正空断言
上一提交留下的两条断言都不成立,评审时发现:

1. assertTrue(activity.contains("private void toggleInlinePlayback()"))
   是重言式。同方法第 2572 行已断言该签名的 indexOf >= 0,此条被其严格
   蕴含,永远不可能独立失败。它的 message 声称验证"通过全屏确认键可达",
   断言里却没有确认键的影子——真正钉住该路径的是第 2602 行对 enterBody
   的全等比较。空断言比没有断言更糟:占着防回归名额,让人以为有人守。

2. assertFalse(...contains("playerPlaybackAction")) 的 message 声称
   "下一集必须在最前",实际只查旧 id 不存在。在 playerNext 前插入任何
   一个新 id 的按钮都能过,改动的核心意图根本没被守住。

改为直接钉不变量:playerActionRow 之后第一个 android:id 必须等于
playerNext(该行 LinearLayout 无 id,故首个 id 即首个控件)。

已做变异验证:在 playerNext 前注入 playerMutantProbe,断言按预期变红并
报 expected:<player[Next]> but was:<player[MutantProbe]>;旧断言在同一
变异下保持绿色,证实上述第 2 条是真漏洞而非风格问题。探针已还原,布局与
上一提交逐字节一致。

顺带把裸 token 匹配改成用法形态 binding.playerPlaybackAction,避免将来
一句提及旧按钮的注释造成误红。

111 个测试全过。
2026-08-25 20:52:31 +08:00
Silent1566
985f7107fe
Merge pull request #166 from Silent1566/dev2
Dev2
2026-08-25 20:51:03 +08:00
Silent1566
0aefb6bf98 Merge remote-tracking branch 'origin/beta' into dev2 2026-08-25 20:11:48 +08:00
Silent1566
777225f61e
Merge pull request #164 from Silent1566/dev1
新增:实验室功能与猫源支持
2026-08-25 20:08:43 +08:00
Silent1566
1f1180b2a7 优化:详情直放控制栏移除播放暂停按钮,下一集前置
该按钮(playerPlaybackAction)仅存在于 TmdbDetailActivity 承载的详情直放/
沉浸融合模式,排在控制栏首位,把"下一集"挤到第二格,拖慢遥控器连播。

它也从未登记进 PlayerButtonSetting.DEFAULT 与 inlinePlayerButtonMap(),
而排序和隐藏全靠 applyOrder()/applyVisibility() 按 id 匹配,未登记的 View
两者都碰不到,因此"设置-播放器按钮"对它无效,既不能隐藏也不能移位。

移除后控制栏首个按钮改为"下一集",与影视原生(view_control_vod_action.xml
首项为 next)对齐,控制栏一打开焦点即落在"下一集"。

播放/暂停能力不变,仍由全屏且控制栏隐藏时的确认键承担
(handleInlineFullscreenHiddenKey -> toggleInlinePlayback),
即 2026-08-17 确认键设计文档的既有路径;播放未开始时的重试入口
保留在"重播"按钮与该确认键上。手机端走 detailControlHost 另一套控件,
不受影响。

进度条向上与控制栏默认落焦改指 playerNext:前者在该按钮被用户隐藏时
回退到几何搜索(与原生 leanback 不设该目标的行为一致),后者经
PlayerControlFocusHelper.ensureFocus 回退到首个可聚焦按钮,均不丢焦点。

原测试断言要求控制栏必须存在该按钮,反转为防回归断言,钉住其不被加回。
2026-08-25 20:03:20 +08:00
Silent1566
cc88e75c4f 文档:更正我转述的未经复核数字,改为自行复核结果
本文此前引用「9477 / 35100(27%)」并标注来源为复审。那是一次未经复核的
转述,我把评审的口头报告写成了带权威感的实测事实,并同时写进了上一个提交的
message——将来读者会当真且追不到源头,这是我的错误。

自行写参数扫描复核(arm 水位 × trough 抬升量 × 振幅 × 周期 × loading 共
3456 组):钉死版 1980 组永不触发、当前版 0 组;仅取 trough 高于 arm+余量 的
1728 组子集,钉死版 1584 组、当前版仍为 0。与 27% 相差甚远。

三个数字(27% / 57.3% / 91.7%)描述的是同一个定性事实,差异全部来自取样空间
的选取。比例是取样空间的产物而非代码的性质,故本文不再引用任何单一百分比作为
该缺陷的度量。

定性结论未变且更稳:钉死水位时凡 trough 高于 arm+余量 的有界振荡都永不触发,
该结论可从代码演绎(净进展自固定锚点起算恒超余量则上限分支永不进;大幅回退每
轮重置 lastProgressAtMs 则停滞分支也永不进),且有可反向验证的用例支撑。已在
文中补上该演绎过程,使结论不依赖任何一次测量。

未改写 e130316f5a 的 message:它已有 recovery tag 指向,契约将 tag 视为回滚
锚点,改写历史的代价高于收益,故由本文承担更正并在此说明,使记录自我纠正。

Verification: 文档变更; 自行参数扫描复核 3456 组(钉死版 1980 组永不触发/当前版 0 组; 靶心子集 1728 组中 1584/0); 全文 27%、35100、9477 除更正说明外均已清除; git diff --check clean
Task-Guard: doc-quantify-correction
2026-08-25 19:51:58 +08:00
Silent1566
d9704f30b4 优化:DV 转换缓冲不再对每个视频轨无条件预留约 2MB
DolbyVisionTrackOutput 的字段初始化器分配 1MB direct ByteBuffer + 1MB byte[]
+ 16KB,而 DolbyVisionExtractorOutput.track() 对每个视频轨都 new 一个,无论
是否 DV7。于是普通片源也无条件付掉约 2MB,其中两个 1MB 只在 P8.1 转换时才用。

改为初始 64KB,靠既有 ensureCapacity 按需倍增:转换会话经几次一次性增长达到
所需容量,非 DV 会话则完全不增长。

未采用 null 式懒分配——两个 ensureCapacity 重载都立即解引用参数,置 null 会在
每个调用点增加 NPE 面而无额外收益;减小初始容量已取得同样的节省。

增长路径未改动,且此前对 >1MB 的样本本就是承重的:ByteBuffer 版 flip()+put()
保内容与写游标;byte[] 版不拷贝旧内容,但两处 outputScratch 增长后都立即用
get(...) 全量重填,inputScratch 也每次先 read 全量覆盖,故安全。已核对文件内
无残留的 1MB 假设。

Verification: DolbyVisionP81ExtractorsFactoryTest 通过; compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; 已核对无 1MB 残留假设、两处 outputScratch 增长后立即全量重填、pending 增长保内容与写游标
Task-Guard: dv-buffer-initial-size
2026-08-25 19:37:25 +08:00
Silent1566
016445db12 修正:补上两处漏改的矛盾表述
自查复扫发现上一提交漏了两处:

observe() 回退分支的注释仍写「The episode start is deliberately preserved」,
正是那种把两个锚混为一谈的含混表述——而该分支恰好同时重锚进展时钟与水位、
只让时间锚存活。已改为分别点明。

文档第 174 行仍用旧常量名 EPISODE_PROGRESS_MARGIN_MS。

全文复扫 'episode start is' 与 EPISODE_PROGRESS 均已归零。

Verification: ExoBufferingStallWatchdogTest 21 用例通过; compileLeanback BUILD SUCCESSFUL; 全文复扫 'episode start is' 与 EPISODE_PROGRESS 均归零
Task-Guard: stall-comment-truth-2
2026-08-25 19:31:04 +08:00
Silent1566
e130316f5a 修正:注释仍宣称水位与时间锚同进同退,与代码矛盾
复审必修项。上一提交把进展水位改为随不连续重锚、时间锚保持不动,但三处注释
仍写着「episode start is preserved across those re-arms」「since the episode
start」——按字面读会把后人引回水位钉死的那个 bug,而该提交的全部价值恰在于
区分这两个锚。三处已改为准确表述,并写明为何必须拆开:每次重锚把门槛抬到新
低点之上,有界信号的低点有上界,故终止性可证。

常量 EPISODE_PROGRESS_MARGIN_MS 度量的是 segment 进展,与已改名的字段不齐,
改为 SEGMENT_PROGRESS_MARGIN_MS;并统一五个常量的可见性为 public(此前
DISCONTINUITY_TOLERANCE_MS 与余量常量是包级,分层无规律)。

补记隐含门槛:余量与上限之比 15s/90s 意味着 buffered 须维持 ≥1/6 实时速率才
能免于上限(复审实测边界为 +166ms/tick 触发、+167ms 不触发)。此前该门槛完全
隐式,单独调任一常量改的就是它,已写入 javadoc。

新增 oscillationWhollyAboveTheArmWatermarkStillTerminates 直测复审指出的最严重
区域:复审以 35100 组穷举对比,水位钉死时 trough 高于 arm+余量 的有界振荡有
27%(9477 组)永不触发,而这正是播放中途重缓冲的日常形态;此前该区域只由
seek 用例间接守住。反向验证:改回钉死会令新旧两条用例双双变红。

顺带按复审建议加强源码断言:手动切换那条改断言 manual-switch-stall 理由串
(写反条件不会保留它,强度提升且不增脆性);方法体切片抽成 methodBody 辅助
并写明其缩进前提;source-text 约定说明提到类级 javadoc。

Verification: ExoBufferingStallWatchdogTest 21 用例 0 失败; PlayerManagerLifecycleSourceTest 4 用例 0 失败; player 全包 1258 用例仅 2 个预存 MPV 失败; 双变体 BUILD SUCCESSFUL; 反向验证水位改回钉死会令新旧两条用例双双变红
Task-Guard: stall-comment-truth
2026-08-25 19:27:59 +08:00
Silent1566
3d31e69e6f 修复:进展水位未随不连续重锚,向后 seek 后仍会误杀推进中的会话
自查发现,是上一提交的 P0 从另一个门重新进来。上次把进展水位记在 arm()、
rebaseline() 不动,理由是维持「回退只重置进展时钟、不重置 episode」的区分。
但向后 seek 后水位仍是 seek 之前的高位,净进展 max(p-旧高位, b-旧高位) 恒被
Math.max(0,...) 夹成 0——即使 position 一路上涨也永远读作零进展,90s 上限照样
误杀。用独立推演程序复现:seek 后正常推进被误杀 = true 于 90000ms。

进展水位属于当前连续段而非 episode,故 rebaseline() 必须一并重锚,字段改名
segmentStart* 以反映真实语义;而时间锚 episodeStartedAtMs 保持不动,那才是
约束回退循环的东西。两者职责不同,不能同进同退。

修后同一程序四场景全部正确:向后 seek 后推进不误杀、向后 seek 后停滞 21s
触发、病态回退循环 90s 终止、慢但在填缓冲不误杀。其中后两者相互拉扯,同时
成立才说明判据到位。

新增 ceilingSparesProgressAfterABackwardSeek 与 stallAfterABackwardSeekStillFires
锁定两侧,看门狗单测共 20 条。

Verification: ExoBufferingStallWatchdogTest 20 用例 0 失败; PlayerManagerLifecycleSourceTest 通过; compileLeanback BUILD SUCCESSFUL; 独立推演程序四场景全部正确(seek后推进不误杀/seek后停滞21s触发/回退循环90s终止/慢填缓冲不误杀); git diff --check clean
Task-Guard: stall-segment-watermark
2026-08-25 19:00:20 +08:00
Silent1566
57be16dc8d 修复:停滞看门狗的绝对上限会误杀正在推进的会话
复审发现的 P0,且是我加上限时引入的。初版上限无条件触发:
if (nowMs - episodeStartedAtMs >= EPISODE_CEILING_MS) return true;
于是「慢但在稳步推进」的会话也会在 90s 被杀——大文件配慢链路完全可能花超过
90s 稳步填那 15s 阈值。这绕过了双条件判据本要保护的场景。

改为上限同时要求「已过 90s」且「自 episode 起点起净进展 <
EPISODE_PROGRESS_MARGIN_MS=15000」。净进展取 position 与 buffered 增量的较
大值,起点水位在 arm() 记录、rebaseline() 不动,维持「回退只重置进展时钟、
不重置 episode」的既有区分。余量与 MAX_STREAMING_REBUFFER_MS 对齐:既保住
正在填阈值的会话,又不放过净进展仅 3s 的病态回退循环。

另修复复审的另两项:
- 手动切内核后停滞不得劫持用户选择。onBufferingStall 原先直接走
  fallbackPlayback,而 onPlaybackTimeout 对 manualPlayerSwitchPending 是单独
  报错的。补同形分支,遥测理由用 manual-switch-stall 以区分入口。
- 新片源须失效旧基线。setMediaItemNow 补 cancelBufferingStallWatchdog(),与
  紧邻的 App.removeCallbacks(runnable) 职责同构。只加在该漏斗底部——
  awaitLocalProxyAndSetMediaItem 的异步路径最终也汇入此处。

三项以 PlayerManagerLifecycleSourceTest 源码字符串断言锁定,其中一条专门守住
BUFFERING 分支的 !isArmed() 守卫,防止后人删它导致 seek 路径退化成重复装载。
文档同时更正了「60s 档先触发、90s 上限轮不到」这个错误论证(它只在无进展时
成立,正是本 P0 的根因),并把链长从 4 步修正为 8 步、上界从 6 分钟修正为
12 分钟(FALLBACK_FULL 与 isAutoChange 均为默认值)。

Verification: ExoBufferingStallWatchdogTest 18 用例 0 失败; PlayerManagerLifecycleSourceTest 4 用例 0 失败; player 全包 1255 用例仅 2 个预存 MPV 失败; 双变体 BUILD SUCCESSFUL; 反向验证删除 setMediaItemNow 那行会令源码断言变红
Task-Guard: stall-ceiling-progress-guard
2026-08-25 18:53:14 +08:00
Silent1566
ed45170300 文档:记录停滞看门狗与内核回退链的时间上界及终止性核对
合并 beta 的回退链改动后,停滞看门狗成为该链新触发点。逐环核对了终止性:
每内核最多进入一次(取出即标记),耗尽后 firstUntriedPlayer 返回 NONE 并走
onError;标记表不在 fallbackPlayer 内重置,故单片源内不会反复耗尽整条链;
7fe00bd7cf 的死循环修复位于 PlayerSetting:228-230,看门狗走同一函数自动受
保护。

记录一个刻意接受的时间上界:最坏四内核各 90s 约 6 分钟才报错,但典型值是
每内核 20s 合计约 80s(死源 isLoading 为假),90s 仅在病态回退采样下生效。
改动前该场景永不报错,故最坏值仍是严格改进。暂不加链级总时长上限。

Verification: 文档变更; git diff --check clean
Task-Guard: doc-fallback-chain-bound
2026-08-25 18:11:54 +08:00
Silent1566
7aa4ce3423 Merge remote-tracking branch 'origin/beta' into dev2 2026-08-25 18:03:26 +08:00
Silent1566
379a66e52f 测试:补齐 decodeModeFact 的分类断言
评审指出分类逻辑从被删的 ExoDecoderKindPolicy 迁到 decodeModeFact 后无人
测试:原 PlaybackMediaFactsMapperTest 只断言过 DecoderKind.HARDWARE,名字
分支与 SOFTWARE 分支一条都没测。也就是说触发整个改动的真实现场——Exo 上报
ffmpegLavc63.3.100-hevc 应判 SOFTWARE——当时并无测试锁定。

decodeModeFact 放宽为包级可见(沿用 ExoUtil 暴露包级静态供测试的既有惯例),
补 6 组用例:引擎自报 kind 优先于名字、Exo 的 ffmpeg 渲染器按名字判软解、
平台软解与 OMX.ffmpeg/libgav1/libvpx/dav1d/avcodec 全覆盖、六个真实厂商硬解
名的反向断言、无法判定时保持 UNKNOWN 而不猜测、大小写不敏感。

反向验证:临时删掉 ffmpeg token 会令 3 条用例变红(含 Exo 现场那条),
确认测试真的锁住行为而非同义反复。

Verification: PlaybackMediaFactsMapperTest 14 用例通过(原 8); 反向验证删除 ffmpeg token 会令 3 条用例变红; compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean
Task-Guard: decode-mode-fact-tests
2026-08-25 18:00:39 +08:00
Silent1566
c0bb7f5007 修复:去短路后 IJK 降负载状态会做虚假声明
评审发现。去掉 Exo 专属短路后 isHardProfileRunningSoftware 对 IJK 也可为
真,getSoftDecodeTuneText 的 IJK 分支因此变为可达并输出「软解降负载
IJK跳帧/滤波」。但 IJK 在硬解档下降负载是明确关闭的:手动档走
decode == SOFT ? configuredSoftTuneMode() : TuneMode.OFF
(IjkSimplePlayer:1028-1032、IjkDecodePressurePolicy:40-43),自动档初值也
是 OFF,须 runtime 见到 actualDecode==SOFTWARE 才升档。于是在「IJK 硬解档 +
回退 avcodec + 手动降负载档」下,面板声称生效而实际为 OFF。

改为读引擎已应用的档位而非从设置反推——反推正是产生错误声明的原因。新增
PlayerManager.getAppliedIjkTuneMode() 转发
IjkPlayerEngine.getAppliedDecodeControlConfig().tuneMode(),OFF 或非 IJK 时
显示「软解降负载 关」,否则附实际档位标签。

MPV 分支经核对本就正确:applySoftDecodeOptions 刻意不按解码档设限(注释说明
MPV 可能在引擎仍表示硬解请求时静默回退),默认 MILD,硬解回退时确实生效。

Verification: compileLeanbackArm64_v8aDebugJavaWithJavac + compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean
Task-Guard: osd-ijk-tune-truth
2026-08-25 17:55:04 +08:00
Silent1566
97c77607b4 修复:解码标签后缀硬编码中文,非中文环境会中英混杂
标签取自本地化数组 select_decode:默认(英文)Soft/Hard,zh-rCN 软解/硬解,
zh-rTW 軟解/硬解。而策略类里硬编码了「→软解」,于是英文环境显示
Hard→软解、繁体环境显示 硬解→软解(简繁混杂)。

改为由调用方注入软解文案:decodeLabel(configuredLabel, softLabel, ...),
PlayerManager 从同一个本地化数组取 [PlayerEngine.SOFT]。策略类仍保持纯逻辑
可单测,两侧文案必然同语言。softLabel 为空时退回原标签,不产出残缺的
「硬解→」。

Verification: DecodeLabelPolicyTest 6 用例通过; compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean
Task-Guard: decode-label-localized
2026-08-25 17:31:56 +08:00
Silent1566
a861c1fde6 补全:软解识别加入 libvpx token
decodeModeFact 的名字启发式清单原含 ffmpeg、libgav1、dav1d、avcodec,
但缺 libvpx。media3 的 VP9 扩展渲染器属软解,漏判会使「硬解→软解」提示
在该编码上不显示。libvpx 是软解库名,厂商硬解名字不含该 token,故不会
造成误报。

Verification: compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean
Task-Guard: decode-facts-libvpx-token
2026-08-25 17:20:02 +08:00
Silent1566
13ed0a779c 重构:解码标签改用既有事实管线,删除重复的分类器
上一提交我新建 ExoDecoderKindPolicy 自己按解码器名分类,但仓库里早已有
等价且更强的实现:PlaybackMediaFactsMapper.decodeModeFact()。它先采信引擎
自己上报的 PlayerEngine.DecoderKind(IJK 经 FFP_PROPV_DECODER_MEDIACODEC/
AVCODEC,MPV 经 hwdec),只在引擎报 UNKNOWN 时才退回名字判定,且 token 比
我的多 dav1d、avcodec。契约要求选设计前先识别既有等价实现,这条我漏了。

改为复用该事实:新增 DecodeLabelPolicy 只负责标签决策不做分类,
PlayerManager.getActualDecodeMode() 读
playbackAutoContextStore.snapshot().media().decoder().videoDecodeMode()。
删除 ExoDecoderKindPolicy 及其 11 个用例。

顺带去掉 Exo 专属短路 if (!isExo()) return configured。该短路之所以必须
存在,恰恰是因为旧实现没用引擎上报;用了之后三个内核一并覆盖,IJK 与 MPV
的硬解回退软解现在同样会显示为「硬解→软解」。

各内核取值来源经核对:Exo 在 ExoPlayerEngine:662 传 DecoderKind.UNKNOWN
但 :660 传了 analytics.videoDecoderName(),故走名字分支;IJK 与 MPV 走引擎
权威上报。

已知覆盖缩小一处:既有 token 清单不含 libvpx,而被删类里有,作为独立单元
补入 PlaybackMediaFactsMapper,不在本单元扩范围。

验证:DecodeLabelPolicyTest 4 用例通过;FallbackDecodeLabelSyncTest 通过;
player 全包 1242 用例仅 2 个预存 MPV 失败(基线 3d5165d3c0 已复现);
compileLeanback 与 compileMobile 均 BUILD SUCCESSFUL。

注:task_guard.sh finish 不支持 scope 内含已删除文件(git add -A 对已从
索引移除的路径报 pathspec 不匹配),故本单元手工完成等价的暂存、提交与
recovery tag,暂存集经核对恰为 6 个已声明路径。
2026-08-25 17:17:44 +08:00
Silent1566
136a90097f
Merge pull request #165 from Silent1566/dev3
优化:播放核心选择与失败回退按 EXO IJK MPV 系统 排序
2026-08-25 17:09:52 +08:00
Silent1566
7fe00bd7cf 修复:内核回退在标记表短于内核常量时可能死循环
firstUntriedPlayer 原先对越界内核判定为「未试过」并返回,而调用方的
markPlayerFallbackTried 对越界下标是静默不写的。两者组合下,若该内核
恰好不可用,nextFallbackPlayer 会反复拿到同一个内核标记不掉,循环停不
下来,卡死播放错误处理路径。

改为把记不进标记表的内核按「已试过」跳过:宁可少一次回退,也不让回退
循环无法终止。此后 firstUntriedPlayer 只返回可写入的下标,标记必然生效,
每轮单调多标记一个,最多 KERNEL_ORDER.length 轮结束。

根因是标记表长度与顺序表可能脱钩:PLAYER_COUNT 原先写死为 MPV + 1,
新增内核常量时不会同步。改为由 PlayerSetting.kernelIndexSize() 从顺序
表推导,两者无法再脱钩。

当前顺序表内核均在 0..3、表长 4,故该缺陷在现版本不可达,属潜在隐患。
补充测试覆盖尺寸自洽与越界终止两个失效模式。
2026-08-25 17:08:06 +08:00
Silent1566
5e63462ce0 加固:软解识别改用子串匹配,避免 OMX.ffmpeg 被漏判为硬解
原先三个软解特征全按前缀匹配。部分机型把 FFmpeg 包在 OMX 名字下暴露为
OMX.ffmpeg.*,不以 ffmpeg 开头,会被判成硬解,正好隐藏本策略要暴露的那种
配置与实际不一致。

改为两类规则:omx.google.、c2.android. 仍按前缀;ffmpeg、libvpx、libgav1
改按子串匹配。厂商硬解名字不含这些 token,故不会造成误报——已用
c2.mtk.、OMX.amlogic.、c2.qti.、OMX.SEC.、c2.rk.、OMX.hisi. 六个真实厂商名
做反向断言锁定。默认仍判 HARDWARE,使无法识别的名字漏报而非误报。

Verification: ExoDecoderKindPolicyTest 11 用例通过; compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean
Task-Guard: exo-decode-kind-hardening
2026-08-25 16:49:14 +08:00
Silent1566
3793141db0 修复:软硬解显示只反映配置档,与实际解码器不一致
诊断面板自相矛盾:配置行显示「EXO / 硬解」,同一面板视频行却显示
decoder ffmpegLavc63.3.100-hevc(FFmpeg 软解),用户无法据此判断卡顿
是否源于落到软解。

根因:getDecodeText 取的是 select_decode[decode],只反映用户配置的解码
档。而两者本就可以合法不一致——硬解档下 getVideoRenderMode 返回 OFF、
getFfmpegVideoRenderMode 又转成 ON,FFmpeg 视频渲染器仍作为兜底装入以接
MediaCodec 拒绝的编码;设备缺该编码硬解时解码就落到软解,标签仍写硬解。

新增纯逻辑类 ExoDecoderKindPolicy 按前缀分类:ffmpeg、omx.google.、
c2.android. 判为软解,厂商解码器如 c2.mtk.hevc.decoder 判为硬解;名字
缺失返回 UNKNOWN 且绝不下判断(起播早期尚无解码器名)。仅在「配置为硬解
且确认运行软解」时把标签显示为「硬解→软解」。

接入点选在 PlayerManager.getDecodeText 这一处漏斗,全部六个控制栏调用点
与 OSD 配置行都经由它,改一处即全部一致。isHardDecode 保持只反映配置档
(它被用于 LUT 可用性与回退链等行为判定,不能被标签逻辑污染),另加
isHardProfileRunningSoftware 供 UI 使用。

顺带修两处显示:getSoftDecodeTuneText 原先在硬解档直接返回空,导致硬解
回退软解时看不到降负载状态,而 E-SP5 刚让该兜底启用降负载,恰恰此时最需
确认;该文案原写「跳帧/滤波/低分辨」,但 E-SP5 已把 skipFrame 改为
AVDISCARD_DEFAULT 不再丢帧,故删去「跳帧」。

Verification: ExoDecoderKindPolicyTest 8 用例通过; exo 全包单测通过; compileLeanbackArm64_v8aDebugJavaWithJavac + compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean
Task-Guard: exo-decode-label-actual
2026-08-25 16:38:45 +08:00
Silent1566
675a87d232 修复:猫源运行时下载改走 GitHub 代理
libnode.so 取自 GitHub release,直连在部分网络下不可达。改为复用项目
已有的 GithubProxy,与"关于"页在线更新共用同一份代理配置(可选内置源、
可自建)。代理失效时回退直连,避免整个功能不可用。

实测默认源 gh-proxy.com 与 ghfast.top 均支持 Range 请求,所以走代理后
仍只下载当前架构的 17.4MB,不损失原有的流量优化。
2026-08-25 16:34:05 +08:00
Silent1566
72ea1b56e2 修复:评审发现的停滞看门狗误判与撤销 Spider 的 PyObject close
合并 origin/beta 为空操作(无冲突),补做两轮对抗性评审,改出四项。

一、暂停被误判为停滞。checkBufferingStall 原先只排除 READY/ENDED/IDLE,
缺 playWhenReady 守卫。缓冲中按暂停时状态仍是 BUFFERING、position 由设计
冻结,缓冲填满后 isLoading 转 false、buffered 也冻结,判据成立即在用户只是
暂停的情况下擅自 fallbackPlayback 切解码器或换内核。

二、回退式 seek 使基线永久失配。observe 原先只把增长视为进展,向后 seek 后
position 与 buffered 双双低于基线,positionMs <= lastPositionMs 恒成立,其后
每个采样都被判无进展并误触发降级。改为大幅回退即重置基线。

三、重新装载挂在不会派发的回调上(复审发现)。第一版在 onIsPlayingChanged
内重新装载,但 media3 的 isPlaying() 要求 STATE_READY,缓冲期间恒为 false,
暂停与恢复都是 false->false 不派发,该段为死代码,缺口未堵。改为不依赖任何
回调:暂停时不 cancel,每轮开启新 episode 并继续轮询,恢复时天然获得完整窗口。

四、重置基线无上界(复审发现)。周期性超过容差的回退可每轮重置计时使超时
无限推迟,停滞问题复活。新增 EPISODE_CEILING_MS=90s 绝对上限,并区分
arm(开启新 episode)与 rebaseline(保留 episode 起点),终止性可证。暂停期
每轮 arm 故暂停时长不计入上限。上限高于 60s loading 宽限,正常长抓取不会被
上限抢先终止。

另:修二时我自己引入过“任何回退即 re-arm 导致永不触发”(buffered 小幅抖动
下每次升降都重置计时),故加 DISCONTINUITY_TOLERANCE_MS=1000 区分不连续与
抖动,上升分支保留 Math.max 累积(加容差后它成为承重逻辑)。

五、撤销 Spider.java 的六处 PyObject close。javap 反汇编确认 PyObject 按
native 地址缓存共享实例,close 会移出缓存并置 addr=0,影响所有持有者;而
所关对象多为共享单例:callAttr(init/destroy/download) 返回 None、put 返回
旧值、type() 返回类型对象、asMap 的 key/value 仍被 dict 持有。该改动原为
finalizer 压力而加,而该假设从未被证实是本次故障成因,收益未证实风险已
证实,整体回退至 origin/beta。

Verification: ExoBufferingStallWatchdogTest tests=16 failures=0; player 全包 1238 用例仅 2 个预存 MPV 失败(基线 3d5165d3c0 已复现); Leanback+Mobile+chaquo BUILD SUCCESSFUL; git diff --check clean; 反向验证 Math.max 改回直接赋值可令 toleranceDipWithGrowthKeepsTheHigherBaseline 变红
Task-Guard: exo-sp3-review-fixes
2026-08-25 16:25:40 +08:00
Silent1566
608a07fde7 Merge remote-tracking branch 'origin/beta' into dev3 2026-08-25 16:19:05 +08:00
Silent1566
0afdcbd7d1 优化:播放核心选择与失败回退按 EXO IJK MPV 系统 排序
选择菜单与播放失败回退统一走同一张内核优先级表:
EXO -> IJK -> MPV -> 系统,外调仍只作为菜单末位的手动项。

内核常量是持久化值(也是标签数组下标),重排会让老用户设置串位,
因此常量不动,顺序单独由 PlayerSetting.KERNEL_ORDER 表达。

回退链改为每次从优先级表开头扫描并跳过已试内核,当前内核在扫描前
先标记为已试,所以「跳过自身」是结构的自然结果:MPV 失败依次走
EXO -> IJK -> 系统,系统失败依次走 EXO -> IJK -> MPV。原实现从当前
内核往后循环,起点不同回退顺序也不同。

菜单侧新增 PlayerKernelDialog.kernels() 统一重排标签,选中项用
kernelRank() 定位、点选用 kernelAt() 还原常量;TmdbDetailActivity
与手机版 VideoActivity 原本各自手搓内核列表,一并改为复用该方法。

顺带清理内联后不再有调用方的 isPlayerFallbackTried。
2026-08-25 16:18:52 +08:00
Silent1566
38c4631082 新增:猫源首次启动的下载进度界面
- 新增 NodeDialog 对话框,显示阶段状态、百分比、已下载/总量与实时速度
- 速度按 1.5 秒滑动窗口折算,避免回调间隔不均导致数字抖动
- 仅在首次需要下载运行时才弹出;后续启动只有几秒,弹窗反而干扰
- 提供「后台继续」按钮,下载耗时较长时不把用户锁在弹窗里
- 弱引用持有依附的 Activity,其销毁后立即放手,避免泄漏与视图越界操作
- 进度文案补齐三份语言资源
2026-08-25 16:05:42 +08:00
Silent1566
79bbb3e01d 新增:实验室功能与猫源支持
实验室(基于 lab-overlay 覆盖包接入):
- 接入 lab 模块全套界面与资源,TV 版从增强设置进入,手机版另有底部
  导航入口(开关控制,默认关闭)
- 补齐 overlay 未含的 AndroidManifest 组件声明与 App 启动注册
- 内置模板配置 lab_template.json,首次进入落盘为可编辑的 lab.json,
  4 个工具替换为查证过的官方 Android 构建地址
- 新增 Ubuntu rootfs 包(proot 双 abi 打包进 assets),承接无官方
  Android 构建的 php/python/nodejs
- 修复 extractTar 未处理符号链接与硬链接,导致发行版 rootfs 不可用
- 修复五处进度弹窗在失败后无法关闭(setButton 在 show 后不生效)
- 新增裸 gzip 解压支持,适配 mihomo 官方 release 格式

猫源(CatPawOpen):
- 新增 nodejs 模块,用 JNI 桥接 nodejs-mobile 的 node::Start
- libnode.so 不打包,运行时按设备架构用 HTTP Range 只取所需条目
  (下载量 54.6MB 降至 17.4MB)
- 新增 CatSpider 适配猫源的 POST+JSON 协议,CatSource 整形其两种
  配置形态并补齐相对 api 的基址
- 新增 /msg 端点承载 bundle 回调(sniff 嗅探、打开内置网页)
- 启动进度接入通知栏,覆盖下载、解压、监听各阶段

其他:
- Nano 注册 SpiderApi 与 CatMessage
- gitignore 忽略 .cxx 构建产物
2026-08-25 14:51:07 +08:00
Silent1566
063ad9d24c 修复:软解降负载的输出缓冲不足与丢非参考帧,改善间歇卡画面
第一轮生效后 CPU 峰值 88%->167%,证明线程数已用上,但用户仍间歇卡顿。
同源读数显示 CPU 平均仅 50%、峰值 167%(4 核可用 400%),说明瓶颈是
流水线节流而非算力。两处参数本身有问题:

一、输出缓冲固定 4,小于线程数。FfmpegVideoDecoder 用它直接开池
(new VideoDecoderOutputBuffer[numOutputBuffers]),而 FFmpeg 帧级并行
需要约 threads+1 帧在飞,池子偏小会把解码器压成周期性停顿。改为
ffmpegDecodeBuffers = clamp(threads+2, 4, 12),下限保持旧固定值以免
单核回退,上限限制内存。

二、skipFrame 用 AVDISCARD_NONREF 在丢非参考帧。这些帧根本不解码、
渲染器从未见过,运动连续性受损而掉帧计数仍为 0,正是用户「掉帧 0 却
看得见卡」的来源。既然瓶颈是缓冲节流,此牺牲不必要,改为
AVDISCARD_DEFAULT 保留每一帧;skipLoopFilter 维持 AVDISCARD_ALL,
只牺牲画质不丢帧。lowres 保留原样,HEVC 原生忽略。

单测抓到我引入的整数溢出(Integer.MAX_VALUE+2 回绕致结果坍回下限),
已在加法前先夹取。

Verification: ExoFfmpegFallbackTuneTest tests=10 failures=0 errors=0 (含一处自查出的整数溢出已修); compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean
Task-Guard: exo-ffmpeg-tune-params
2026-08-25 14:11:20 +08:00
Silent1566
fee8c2cb16 修复:硬解回退到 FFmpeg 软解时未启用降负载,导致一步三卡
用户实测 4K25 HEVC:配置为硬解,但 decoder 实际是 ffmpegLavc63.3.100-hevc
(libavcodec 63 = FFmpeg 9.x),画面一步三卡而掉帧计数为 0——帧不是被丢弃,
是解码来不及、渲染迟到。

原因:调优开关此前算作 decode == SOFT && isSoftVideoTuneEnabled(),即只有
显式选软解档才降负载。但硬解档下 getVideoRenderMode 返回 OFF,
getFfmpegVideoRenderMode 又把 OFF 转成 ON,FFmpeg 视频渲染器仍作为兜底
装入以接 MediaCodec 不支持的编码。设备缺该编码硬解时解码就落到这个兜底
渲染器,却走 !softVideoTune 分支——不给线程数、不跳环路滤波、不跳非参考帧、
不降 lowres。恰好在内容重到硬件都不接的场合完全不降负载;用户若主动选软解
反而更流畅。

该门控是既有代码(6ded321295),非本次合并引入;合并对 ExoUtil 只改了 DV
相关部分。但合并把 nextlib 升到 FFmpeg 9.0.1,同一条无调优路径耗时变化,
使既有缺陷显形。

改法:拆出 shouldTuneFfmpegVideo(tuneEnabled, reachable),不再以解码档为
门控;新增 ffmpegVideoTune 参数只供视频渲染器,交给 CompatFfmpegAudioRenderer
的 softVideoTune 原样保留,音频行为不变。兜底语义不变,
isFfmpegVideoFallbackOnly 仍为真,不回归 91a667637e 修过的抢轨问题。

Verification: ExoFfmpegFallbackTuneTest tests=6 failures=0 errors=0; compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean
Task-Guard: exo-ffmpeg-fallback-load-shedding
2026-08-25 13:41:54 +08:00
Silent1566
a33164e012 新增:延后MKV索引的设置开关入口
接上一提交的读取点。条目加入 addExo(),因该 flag 只作用于 Exo 的
MatroskaExtractor;取值与切换按既有 DECODER_FALLBACK 模式接线。
位置:播放器设置 → 性能 → 解码档「延后MKV索引」,默认开启即现状。

供实机 A/B:起播明显变慢时关掉它再测同一片源,可判定是否为
E-SP2 延后 Cues 所致。

Verification: compileLeanbackArm64_v8aDebugJavaWithJavac + compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean; option verified in addExo()
Task-Guard: exo-sp4-deferred-cues-ui
2026-08-25 12:45:09 +08:00
Silent1566
88c3d7e68f 新增:播放器诊断显示起播各阶段耗时,并可关闭延后MKV索引
合并上游后所有片源起播都变慢(含普通 1080p,不掉帧)。能同时影响所有
片源的候选有三个:E-SP2 延后 Cues(gate 只判远程不判大小,覆盖每个远程
MKV)、nextlib FFmpeg 9.0.1(音频渲染器恒开,所有片源都过)、自定义
media3-extractor 构件(替换整个 extractor 模块)。现有信息无法区分。

已排除 DolbyVisionP81ExtractorsFactory 的逐样本包装:非 DV7 时
format() 以 codecs 前缀先判后放行,sampleMetadata() 只多一个布尔判断,
sampleData() 无条件转发,转换器与重写缓冲不实例化。

PlaybackTrace 已有全阶段埋点但 stageElapsedMs 是包级私有且仅在
SpiderDebug 开启时落日志,定位瓶颈必须导出 debug log。故先做可见性:
新增 startupSummary()/slowestStage(),按时间顺序而非枚举声明顺序输出
(READY 声明在 FIRST_FRAME 之前但实际后到,直接迭代 EnumMap 会乱序),
未到达的阶段省略。诊断面板新增「起播」行显示累计耗时、相邻增量与最慢阶段。

同时加 isDeferredCuesEnabled()(默认 true 维持现状)并让工厂的
deferSeekForCues 受它约束,供实机 A/B。UI 入口为第二单元。

顺带修回归:诊断结论里「缓冲偏少」原读 getBufferedDuration(),该值被
PlaybackDiskBufferStore 磁盘区间灌高导致永不触发,改用原生 buffered。

Verification: PlaybackTraceTest tests=12 failures=0 errors=0; compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean
Task-Guard: exo-sp4-startup-stage-visibility
2026-08-25 12:39:18 +08:00
Silent1566
ec1603126a 文档:更正 E-SP1 与实际实现不符的超时记载
E-SP1 声明不修改 STATE_READY/PlaybackStartupPolicy/seek,并称超时取消保持
不变,但其随附提交 f2721c43b6 实际在 onRenderedFirstFrame() 撤销了启播
超时,影响所有 Exo 播放。按契约「任务文档自持其历史」补记该偏差并指向
E-SP3 的纠正方案。

Verification: documentation-only change; git diff --check clean; discrepancy verified against commit f2721c43b6 and current PlayerManager source
Task-Guard: esp1-record-correction
2026-08-25 10:34:05 +08:00
Silent1566
0a540be3b3 修复:Python 爬虫临时 PyObject 漏 close,慢线路占 GIL 时拖慢回收
同文件的 toStr/toBool/proxy 已用 finally close,但六处漏了:

- init: obj.put 与 app.callAttr("init") 的返回值(put 经 javap 确认返回 PyObject)
- destroy: app.callAttr("destroy") 的返回值
- download: app.callAttr("download") 的返回值
- getHeader: asMap() 每个 entry 的 key 与 value 全未关
- getStream: o.type() 的返回值

未关的包装对象要等 finalizer 回收,慢线路持有 Python GIL 时回收会被拖住,
队列积压后堆增长带来的 GC 压力会拉长主线程停顿。改为显式 close,
o.type() 抽出 isBytes 以便在 finally 中释放。

行为不变,仅释放时机提前。

Verification: chaquo:compileArm64_v8aDebugSources + app:compileLeanbackArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean; PyObject return types confirmed via javap on chaquopy_java-17.0.0.jar
Task-Guard: chaquo-spider-pyobject-close
2026-08-25 10:33:15 +08:00
Silent1566
eabd3fe86d 修复:起播/拖拽后永久转圈卡死,BUFFERING 停滞无兜底
上游 f2721c43b6 在 onRenderedFirstFrame() 撤销启播超时,意图是避免慢音频轨
被误判为连接超时。但首帧不等于可播放(PlaybackStartupPolicy 要求 STATE_READY),
音频轨迟迟不来时会永久停在 BUFFERING 且再无任何保护,fallbackPlayback 的自动
降解码/切内核链因此永不触发,表现为转圈不消失后彻底卡死。

叠加两处既有缺陷:onPlaybackStateChanged 对任何非 IDLE 状态都撤除启播超时
(含 BUFFERING);而 BUFFERING 停滞没有通用兜底,唯一的停滞看门狗
ExoTunnelingProgressWatchdog 要求隧道启用而隧道默认关闭。

改为换防而非撤防:新增 ExoBufferingStallWatchdog,在 BUFFERING、首帧未达
READY、seek 后三处装载。判据要求 position 与 buffered 同时不前进,故正常
重缓冲不会误杀;buffered 取 Exo 原生值而非含磁盘区间的 effective 值。
isLoading 为真时改用更长上限,避免误杀 E-SP2 的远程 MKV 尾部 Cues 抓取,
但仍有界以防挂死 socket 永不触发。停滞入口独立于 onPlaybackTimeout,
不复用其启播专用重试。

PlaybackActivity.onExoFirstFrame 不再隐藏加载圈:首帧只解除 shutter 让画面
可见,圈交回 STATE_READY 收(经 hideProgress 一并清掉 mR3 网速自循环)。
此前在首帧即抹掉圈,使仍在缓冲的会话看起来像画面卡死。

Verification: ExoBufferingStallWatchdogTest tests=10 failures=0; compileLeanbackArm64_v8aDebugJavaWithJavac + compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL; git diff --check clean
Task-Guard: exo-sp3-buffering-stall-watchdog
2026-08-25 10:28:54 +08:00
Silent1566
3d5165d3c0
Merge pull request #163 from Silent1566/dev3
修复:详情直放模式退出重进后记不住已选播放线路
2026-08-24 20:09:35 +08:00
Silent1566
8f85143d35 修复:清理缓存漏清线路偏好、超容文件无法收敛
第二轮评审又发现三处缺陷,其中第一处用户可见:

一、「清理缓存」对线路偏好等于没做

FileUtil.clearCache 用 Path.clear(Path.cache()) 删掉了缓存目录下的
flag_preferences.json,也显式清了 EpisodePositionCache 的内存单例,
但漏了同样是进程内单例的 FlagPreferenceCache。内存 map 完好无损,
用户下一次切线路就会把整张旧 map 重新落盘,连被删掉的缓存目录都会
被 mkdirs 回来。补上 clear() 调用。

二、超容的旧文件永远收敛不到上限以内

removeOldest 淘汰后不置 dirty,遇到已经超容的文件时内存里减下去了
但不落盘,重新打开又是超容状态;load() 也完全不做容量收口,且每次
put 只淘汰一条。改为 trimToCapacity 循环淘汰并置 dirty,load() 末尾
也收口一次(不主动写盘,dirty 交给下一次 put 带出去)。

三、rename 兜底可能把两份数据都弄丢

原先在 renameTo 失败后直接 delete 目标文件再重试,重试若也失败,
异常处理又会删掉临时文件,旧文件和新文件就都没了——比修复前的
直写还糟。改为先把旧文件改名成 .bak 备份,新文件就位后才删备份,
中途失败则回滚。clear() 也一并清理可能残留的 .tmp。

评审同时指出 reaffirmingTheSameSelectionRenewsItOnDisk 里的
assertNotNull 是恒真断言(60 天 < 90 天过期窗口,不续期也能存活),
已删除并把时间戳断言收紧为 >= firstWrite。

测试补到 18 项,新增:一天内重申不重复写盘、超容文件收敛并落盘、
只有线路名的偏好(savePreferredFlag 在索引未知时的真实形态)、
删除要落盘、clear 清理临时文件。

其中超容收敛的用例做过变异验证:注掉 trimToCapacity 里的 dirty 置位
后该用例失败,确认它真能钉住这个缺陷。注意断言必须查磁盘上的真实
条目数——load() 每次都会收口,断言重新载入后的 size() 恒为上限值,
看不出到底有没有落盘。

mobile 与 leanback 两个 flavor 编译通过,相关测试全部通过。
2026-08-24 20:06:51 +08:00
Silent1566
83e3f1c1d8 修复:线路偏好缓存的过期续期、并发写盘与损坏数据处理
代码评审发现 FlagPreferenceCache 有四处缺陷,均已修复:

一、长期只用同一条线路的用户偏好会失效

put() 原先在「选择未变」时提前 return,只刷新内存对象的 timestamp
而不置 dirty。起播路径每次换集都会重申当前线路,于是磁盘上的
timestamp 一直停在首次选择的时刻,90 天后偏好被判过期——恰好是最
稳定的使用方式反而丢失偏好。改为超过 RENEW_INTERVAL(1天)就续期
落盘,一天内的重复调用仍不写盘。

二、dirty 缺少可见性保证,且 save 顺序会丢写

dirty 由 UI 线程写、Task.execute 的后台线程读,原先是普通 boolean,
改为 volatile。save() 原先在写盘成功后才置 false,会把这期间并发
put 的置位擦掉;改为先置 false 再快照写盘,期间的 put 会重新置上
dirty,下一次 save 仍会落盘。写盘失败时把 dirty 置回,否则这次
选择再也不会被重试。

三、损坏数据会让偏好永久失效

gson 反序列化不走构造函数,缺字段的数据 timestamp 为 0,
isExpired() 会直接判其过期。改为 timestamp<=0 时按「刚写入」处理,
下次 put 自会续期成有效值;这类条目在 removeOldest 里排序最小,
也会被优先淘汰,不会长期占用容量。同时新增 isUsable(),load()
与 get() 都丢弃两个字段皆空的条目——它们匹配不到任何线路,
留着只会挡住后续写入的有效偏好。

四、写盘中途失败会留下截断的 JSON

原先直写目标文件,磁盘满或进程被杀时会在磁盘上留下半个 JSON,
下次 load 整份偏好都解析不出来。改为先写 .tmp 再 rename 替换,
失败时清理临时文件。

评审另外提出的两点经核实不适用:播放失败只走 showInlineError 显示
错误,不会自动切线路,不存在把回退线路误存为偏好的路径;换源经
switchSourceDetail 重写 intent 的 key/id 并携带目标线路,而 intent
优先级高于偏好,不会被旧偏好劫持。TV 版 onDetailFlagKey 只做焦点
移动,实际选中仍走 setOnClickListener,落盘已覆盖。

FlagPreferenceCacheTest 补到 13 项,覆盖续期、缺 timestamp、
不可用条目、文件损坏、原子写与重复保存。mobile 与 leanback
两个 flavor 编译通过,相关测试全部通过。
2026-08-24 19:26:55 +08:00
Silent1566
57eaf84793
Merge pull request #162 from Silent1566/dev1
合并上游 fish2018/webhtv fongmi-sync 最新代码
2026-08-24 19:16:06 +08:00
Silent1566
c72d09092a 合并上游 fish2018/webhtv fongmi-sync 最新代码
上游 25 个提交,主要内容:
- Exo Dolby Vision DV7 → P8.1 CSD 适配与 HDR10 回退(首帧超时、运行时失败、重建后保持)
- Exo 首帧渲染后再显示画面,首帧到达即停止启动超时
- Matroska 远端流延迟解析 Cues(仅 HTTP/HTTPS),随附 media3-extractor 构件与补丁
- nextlib FFmpeg 升级至 9.0.1
- MPV DV7 HDR10 回退保持直通输出
- 新增上游集成治理文档与 .codex 任务守卫脚本

冲突解决(3 处):
- .gitignore:保留双方新增条目
- PlayerManager:本地已将 onPlaybackTimeout 移至文件后部,删除上游重插入的
  副本,仅把上游新增的 retryExoDv7FirstFrameTimeout() 回退分支并入本地版本
- PlaybackActivity:保留本地 onPlayerRebuilt() 与上游新增 onExoFirstFrame()

验证:mobile/leanback arm64 debug Java 编译通过;上游改动的
DolbyVisionP81ExtractorsFactoryTest、MpvAutoOutputPolicyTest、
PlaybackDiskBufferStoreTest 单测全部通过。
2026-08-24 18:49:48 +08:00
Silent1566
3f33a57b2e Merge remote-tracking branch 'origin/beta' into dev3 2026-08-24 18:18:02 +08:00
Silent1566
8a090ef7b6 修复:详情直放模式退出重进后记不住已选播放线路
线路选择原本只作为播放的副产物写进 History.vodFlag,而写库要过
saveInlineHistory 的播放态门槛(isFusionMode() || detailPlayerActive)
和 History.canSave() 的 position>0 门槛。详情直放模式下这两道门槛
在纯详情页停留时都不满足:

- 从全屏播放器返回时 closeDetailFullscreenPlayer 会把 detailPlayerActive
  和 inlineStarted 一并置 false,此后包括 onDestroy 在内的所有存档路径
  全部空转,onPause/onStop 本就不存档
- 详情页里切线路只改内存字段 selectedFlag,零写库

于是「进详情页 → 切线路 → 退出」全程没有一次数据库写入,进程被杀后
重进时 findInitialFlag 读到的还是旧记录,没有记录时更会退回第一条线路。

改为把线路选择当成独立的用户偏好落盘:

- 新增 FlagPreferenceCache,按 siteKey|vodId 记当前线路,内存优先 +
  JSON 落盘 + 90 天过期,沿用 EpisodePositionCache 的既有模式
- 不写 Room:免 migration 风险,也避免 position=0 的空记录被
  getForDisplay() 当卡片显示,污染「最近观看」
- 同时存 Flag.stableKey 的「线路名#索引」与线路名,前者区分同名线路,
  后者在源站线路增删导致索引漂移时兜底
- findInitialFlag / initialStandaloneFlag 优先级统一为
  intent 显式指定 → 偏好 → History → 第一条线路,两处保持一致,
  否则季度预取会按另一条线路取季再重载
- 起播时同步偏好,避免从历史列表跨线路续播后偏好指向旧线路

findInitialFlag 是沉浸融合/炫彩详情/详情直放三种模式的共用入口,
手机版与 TV 版共用 TmdbDetailActivity,两端同时生效。

两处实现细节:flagIndex 返回 -1 时不写稳定键,因为 Flag.stableKey 会
把 -1 夹成 0,留下一个必然命中首条线路的假键;put 只在选择真正变化时
置 dirty,起播路径每次换集都会重申当前线路。

已验证:FlagPreferenceCacheTest 6 项(含进程重启后偏好存活)、
TmdbDetailActivityLayoutTest 109 项、HistoryPlaybackTest 60 项全部通过,
mobile 与 leanback 两个 flavor 编译通过。
2026-08-24 18:17:03 +08:00
Silent1566
8c9ab62d06
Merge pull request #161 from Silent1566/dev1
新增:详情页沉浸/炫彩/直放模式补回播放器搜索按钮并支持站内快搜
2026-08-24 17:52:58 +08:00
Silent1566
02b1254c2e 新增:详情页沉浸/炫彩/直放模式补回播放器搜索按钮并支持站内快搜
TMDB 三种详情模式的播放器控制栏一直没有搜索按钮,用户切过去就找不到入口。
PlayerButtonSetting.SEARCH 早已在配置层就绪,缺的是布局里的按钮本身,
所以这三种模式无法通过「播放设置-播放器按钮」统一管控搜索项。

搜索行为复刻影视原生的站内快搜:接 SiteViewModel 增量并发搜索流,
边搜边出结果、TV 端带站点进度,同一站源的多个命中全部列出,
选中即换源续播当前集;长按仍跳全局搜索页。

QuickSearchDialog 与 QuickAdapter 都在 flavor 源集、TmdbDetailActivity 在
main 源集,编译期不可见,故沿用 CastDialog 既有的反射桥接方式。
反射目标补了 proguard keep 规则并用 R8 产物核对保名,
否则只有 release 包会静默退化成跳全局搜索页。

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-24 17:34:16 +08:00
Silent1566
d26e40ba18
Merge pull request #160 from Silent1566/beta
合并 beta 到 main:统一阅读器、语音广告识别、播放器稳定性与 TV 端焦点修复
2026-08-24 15:53:26 +08:00
Silent1566
849543bd65 docs: design app branding customization 2026-08-24 15:40:23 +08:00
Silent1566
2196077667
Merge pull request #159 from Silent1566/dev3
修复:手机版直播页屏幕亮度自动变到最亮
2026-08-24 15:18:08 +08:00
Silent1566
c53b9e881a 修复:手机版直播页屏幕亮度自动变到最亮
根因是亮度量程换算错误。Util.getBrightness() 把 Settings.System.SCREEN_BRIGHTNESS
写死除以 255,但该值量程由厂商决定(小米/OPPO 常见 2047、一加 1023、华为部分 4095),
大量程机型上算出的基准亮度远大于 1,手势结果被永久夹到 1.0 并持久化,此后每次进入
播放页都回灌覆盖窗口亮度、关掉系统自动亮度。点播页因夜间模式 OFF 时会硬写 -1 而歪打
正着复位,直播页没有这条路径,所以只在直播页暴露。

主要改动:
- Util.getBrightness() 改读系统真实量程 config_screenBrightnessSettingMaximum,
  自动亮度下不再采用 SCREEN_BRIGHTNESS(那只是手动滑条残留值,会导致越调越亮),
  并改用字符串解析兼容把该值存成浮点的 ROM
- 新增 BrightnessPolicy 承载归一化、上限合并、手势增量等纯计算逻辑,附 17 项单测
- CustomKeyDown 分离「用户手势值」与「夜间模式上限」,写窗口前统一合并;
  补 ACTION_CANCEL 落盘;值未变化时不回写窗口属性
- VideoActivity.applyNightMode() 不再直接覆写窗口亮度,改为下发上限参与合并,
  补上 NIGHT_MODE_ANTI_FLASH_DESIGN.md 设计中遗漏的 min(用户值, 上限),
  同时消除点播页与直播页的行为分叉
- PlayerSetting 增加一次性迁移,清理旧算法在大量程机型上写入的污染值;
  255 量程机型不受旧 bug 影响,其 1.0 是用户主动设定,予以保留
- PlayerGesture(TmdbDetailActivity 内嵌播放器)同一处夹取逻辑一并修复

验证:BrightnessPolicyTest 17/17 通过;mobile 全量 3586 项仅 2 项失败,均为
MpvPreloadControllerTest 既有问题(已在干净基线复现,与本次改动无关);
mobile 与 leanback 两个变体均编译通过。未做真机验证,量程差异需实机复核。
2026-08-24 15:12:57 +08:00
Silent1566
aedbfd04ac
Merge pull request #158 from Silent1566/dev2
修复:炫彩详情网格卡片左右间距不对称
2026-08-24 14:29:24 +08:00
Silent1566
2693dc174a 修复:炫彩详情网格卡片左右间距不对称 2026-08-24 14:19:07 +08:00
Silent1566
c931be95b5 Merge remote-tracking branch 'origin/beta' into dev3 2026-08-24 14:18:00 +08:00
Silent1566
503f9d525d
Merge pull request #157 from Silent1566/dev3
新增:小说与漫画阅读模式合并为统一阅读器
2026-08-24 11:22:41 +08:00
Silent1566
da29a687e3 Merge remote-tracking branch 'origin/beta' into dev3 2026-08-24 11:05:15 +08:00
Silent1566
d1c6fc4341 修复:阅读器代码评审问题(安全加固、生命周期与资源泄漏)
安全
- reader.html 正文净化从正则黑名单改为 DOMParser + 标签/属性允许列表:
  原实现可被 <img/onerror=x>、无引号属性、不闭合标签绕过,而页面运行在
  file:// origin 上,一旦执行任意 JS 即可读应用私有文件
- 关闭 setAllowUniversalAccessFromFileURLs,切断「读私有文件 + 无 CORS 外发」
- 新增 shouldOverrideUrlLoading,只允许停留在本地模板页;否则被导航到远程页面后
  AndroidReader 这个 JS 桥会一并暴露
- readerpic:// 由「接受任意 URL」改为会话内 token 换址,避免被当作取回代理
  探测回环/内网地址并伪造 Referer
- PDF 加载失败提示改 textContent(本地模式下文件名会被拼进异常消息)
- evaluateJavascript 前转义 U+2028/U+2029,避免旧版 WebView 语法错误导致白屏

正确性
- PDF 下载移出主线程:targetSdk 28 下必抛 NetworkOnMainThreadException,
  且被 catch 吞成「当图片渲染」,表现为破图
- PDF canvas 改为按页序同步插入,不再按渲染完成顺序 append(页序会乱)
- onEpisodeResolved 始终写 kind 并清空另一路数据,否则漫画站夹带的 novel://
  章节会继续渲染上一章图片
- isCurrentChapter 改为按章节 URL 比对:原实现在 index 已被覆盖后取
  currentChapterName(),等于拿目标章和自己比,恒为真,导致漫画永不重解析
- 切章失败新增 __chapterFailed 回调 + 30s 看门狗:原先 switchingChapter
  一旦卡住,此后所有阅读进度都不再上报
- restoreAnchor 加代号,内容替换时作废在途循环,避免它继续对新章 scrollTo
  并让 restoringPage 永久为真
- 注入时按 restore 标志决定是否上报,避免把待恢复位置覆盖成 0
- PDF 在拿到总页数后补报一次进度,否则不滚动就没有历史记录
- 各失败分支统一清零 restoreAnchor/restoreTotal,避免污染下一章定位
- ContentDispatcher 分流路径从 historyKey 解出 vodId,此前传空导致进度不工作
- 目录窗口化以当前章为中心(原 start 恒为 0 等于未生效),补向上加载;
  面板容器改名 chapterGridPanel,解决与隐藏容器 id 重复互相覆盖

生命周期与资源
- NovelRouter.host 改 WeakReference:原静态强引用 Activity 从不清空,确定泄漏
- currentReader 清空加 == this 守卫,避免旧实例抹掉前台实例的注册
- onDestroy 仅在 isFinishing 时清缓存,否则配置变更重建会渲染成空章
- WebView 先从 view 树摘除再 destroy 并置 null
- PDF/图片/zip 条目改流式限长读取,先写 .tmp 再改名,避免 OOM 与半截缓存
- ZipFile/EPUB 改 try-with-resources;errorJson 改用 JSONObject 生成
- 静态 payload/章节缓存加 TTL 清理;picTokens 按章清理
- index/kind 加 volatile,阅读位置收进不可变 Progress 快照,消除撕裂写入
- 后台任务执行前检查 isDestroyed,避免废弃下载阻塞下一本书首屏

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-24 10:34:18 +08:00
Silent1566
7aaa4035df Merge remote-tracking branch 'origin/beta' into dev3
冲突:SettingEnhanceFragment.java import 段,两侧各自新增,保留双方。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-24 10:13:57 +08:00
Silent1566
1408b69107
Merge pull request #156 from Silent1566/dev1
修复:直链起播选到最低分辨率、视轨列表高亮分不清在播哪条
2026-08-24 10:01:53 +08:00
Silent1566
1536c1bcc8 修复:直链起播选到最低分辨率、视轨列表高亮分不清在播哪条
起播画质:applyVideoLimit 之前关掉了 setForceHighestSupportedBitrate,把选轨
完全交给 media3 原生 ABR。原生 ABR 起播时只有 DefaultBandwidthMeter 的初始猜测
(Wi-Fi 4.3Mbps 起、未知网络 1Mbps)可用,再乘 bandwidthFraction,直播缓冲为 0
时又不允许向上切档,HLS 多码率直链必然停在最低几档。改为在设备与网络约束内固定
选画质最高的轨道,恢复上游 fongmi 的行为,setMaxVideoSize/Bitrate/FrameRate 等
约束一并保留。

代价是同组只会选中一条轨道(eligibility 变为 FIXED),原生 ABR 不再兜底吞吐。
而默认档位(PROFILE_AUTO + 轨道限制开启)用的 AutomaticVideoConstraintController
只监听掉帧和编解码错误,对带宽零感知——弱网锁在最高档时解码器并无压力,掉帧不会
触发,会一直重缓冲且无法恢复。为此新增 Fault.THROUGHPUT,并给该控制器补上带宽
估算与重缓冲两个降档触发,降档步进仍由已有的 15 秒冷却限流。带宽判断只比对轨道
自己申报的码率,未知时直接放弃(不能退回 appliedLimit,那是设备能力上限,会让
码率不高的正常片源持续误降档),交给重缓冲兜底。重缓冲判断前先对齐会话,避免把
上一集的起播状态带到新一集而白降一档。

视轨高亮:media3 的 Tracks.Group.isTrackSelected 会把自适应候选集里的所有轨道
都标为已选中,所以列表会同时高亮多项,且与实际在解码的那条无关。改为用
player.getVideoFormat() 收敛到唯一一条,匹配不上时退回播放器原始标记,不会出现
一项都不高亮。匹配按引用比对(字段完全相同的两条轨道用 equals 会同时命中),
并拒绝同分辨率的不同编码,避免把 H.264 当成正在解码的 HEVC。轨道快照只读一次,
MPV/IJK 的快照由原生回调线程写入,分两次读可能拿到不同集合。

音轨与字幕行为未变。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-24 09:54:09 +08:00
Silent1566
69bb0ace7b
Merge pull request #155 from Silent1566/dev4
修复:TV版设置视频壁纸后播放视频卡顿
2026-08-24 09:45:15 +08:00
Silent1566
ae89e6c1c2
Merge pull request #154 from Silent1566/dev2
修复:播放失败回退后设置弹窗的解码标签不刷新
2026-08-24 09:44:50 +08:00
Silent1566
ef3d5765b5 修复:播放失败回退后设置弹窗的解码标签不刷新
现象:手机版遇到播放失败回退(软解后切核心)时,内核标签会变,
软硬解标签一直停在起播时的值。TV 版看起来正常。

根因不在引擎侧。日志确认回退链在引擎侧是完整执行的
(IJK 硬解→IJK 软解→系统硬解→系统软解→MPV),失败原因始终是
片源 m3u8 连接超时,换内核和解码都救不回来。真正的问题是
UI 标签漏刷,三条播放链路各有一处独立缺口:

- ControlDialog.setPlayer() 只刷了 decode 的可见性、没刷文字,
  两个 flavor 都是。这是"内核会变、解码不变"的直接原因。
- leanback VideoActivity.onPlayerRebuilt() 没有刷新弹窗,
  所以 TV 版弹窗同样会显示旧值(此前未暴露是因为没有调用方)。
- TmdbDetailActivity 完全没有 onPlayerRebuilt() 覆写,融合详情页
  内嵌播放器的内核和解码标签回退后都不刷新。

另外补上轨道就绪后的二次刷新:onPlayerRebuild 触发时新引擎还没有
轨道,宿主的音轨/字幕/画质按钮此刻是隐藏态,弹窗若只在这一刻抄一次
会把中间态固化下来,因此在 onTracksChanged/onTitlesChanged 再抄一次。
setPlayer() 末尾改调 setTitleVisible()(内部会带上 setTrackVisible()),
否则章节可见性抄不到,而它参与轨道行的计算。

新增 FallbackDecodeLabelSyncTest 用源码断言锁住三条链路的刷新点,
含一条守卫:新覆写必须排在 TmdbDetailActivityLayoutTest 用于断言
onPrepare 的源码切片之外。

验证:两个 flavor 编译通过;mobile 3541 / leanback 2779 项单测通过,
仅 MpvPreloadControllerTest 2 项失败,stash 后可复现,属既有失败。
回退流程本身未在真机验证。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-24 04:46:06 +08:00
Silent1566
97a432a637 修复:TV版设置视频壁纸后播放视频卡顿
视频壁纸是独立的 ExoPlayer + TextureView,全屏铺在 Activity content 最底层。
它在播放页背后继续解码,既多占一路 MediaCodec 硬解实例,又按壁纸帧率触发整个
界面重绘,在电视盒子上表现为播放卡顿。手机版早有 customWallMotion() 开关在
播放页把动态壁纸降级为首帧静态图,TV 版漏了这个机制。

- leanback BaseActivity 补上 customWallMotion() 钩子并传入 CustomWallView,
  VideoActivity 覆写为 false,与手机版对齐
- TmdbDetailActivity 同样关闭动效,该页自带内嵌播放器且两个 flavor 共用
- CustomWallView 改为在 onStop 释放播放器而非仅暂停,返回栈里的页面不再占着
  硬解实例;onResume 通过 videoRestorePending 重新 prepare
- 页面已 onStop 时收到换壁纸事件不再立即建解码器,避免白占到用户回来
- 修 stop() 用 isPlaying() 做前置条件的漏判:壁纸 buffering 时该值为 false,
  此时切换壁纸会把旧 MediaItem 留在播放器里
- loadVideo() 给首帧缓存加兜底色,避免缓存缺失时把底图清空
- 动效决策抽成 WallMotionPolicy 纯 Java 类以便单测,并补两个 flavor 的回归锁

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-24 03:14:29 +08:00
Silent1566
c141a8beca 新增:小说与漫画阅读模式合并为统一阅读器
内容分流与阅读器
- 新增 NovelRouter 统一路由:站点级分流(命中小说/漫画源规则的站点直接进阅读器,
  不再先进播放页再报错)、play_url 协议分流(novel:// / pics:// / manga://)
- 新增 ReaderContentHandler 接入 ContentDispatcher,与 AudioContentHandler 同构
- 新增 WebReaderActivity + assets/reader.html:小说翻页、漫画瀑布流、PDF 漫画(PDF.js)、
  目录、主题、自动滚动
- 新增 NovelSourceConfig / ComicSourceConfig 与对应设置弹窗,默认规则 [书][小说] / [画][漫画]

阅读进度记录
- 新增 ReaderHistory:复用 History 表,阅读记录与影视记录同列表展示
- 按「章节 + 章节内锚点」记录(小说=段落序号,漫画/PDF=页序号),
  不用滚动百分比:漫画懒加载、小说 content-visibility 都会让文档高度不稳定;
  锚点还能在改字号/行高后回到同一段文字
- 恢复时等排版稳定(目标锚点位置连续两次一致)再收工,避免图片解码把内容推走
- 兼容早期百分比格式记录

体验
- 进入阅读器显示原生加载态(与阅读主题同色),消除 WebView 首帧前的黑屏
- 目录窗口化渲染:每次 60 章 + 滚动追加 + 事件委托,5000+ 章目录从卡死数十秒降到秒开
- 章节切换由阅读器自行解析(站点级分流无播放器宿主时也能切章)
- 补 TV-reader 日志:console / 资源错误 / 渲染进程崩溃 / 注入回执

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 23:50:01 +08:00
Silent1566
e7ad97c2d5
Merge pull request #153 from Silent1566/dev1
修复:TMDB 详情页线路里混进站源名
2026-08-23 22:31:59 +08:00
Silent1566
9f0074fd9e 修复:TMDB 详情页线路里混进站源名
线路行里会冒出别的站源名当 chip,看着像线路,点下去其实是换源。
bindFlags 先按 vod.getFlags() 渲染真线路,随后 bindSeasonSourceRoutes
把"同 TMDB ID + 同季在其他路由的历史记录"用同一个 createChipButton
追加进同一个 flagContainer,文字直接取 site.getName()。这些 chip 还
落在 flags.size() 之后,renderFlagSelection 和 focusDetailFlagButton
都遍历不到,所以永远点不亮。

改为让 chip 文字自带来源语义:异站显示"换源·站名",同站的另一个入口
(按季拆条目时常见)显示"同站·条目名",都不再和右侧"站源:X"重名。
条目名为空时退到 vodId 再退到站名;同名条目追加序号,避免两个一样的
chip 只能盲点。站名统一走 getDisplayName(),尊重用户改的名字,
TmdbHeaderView 的"站源"标签一并对齐。

注意没有过滤掉同站路由:聚合器的去重键是 siteKey+vodId,同站不同
条目是合法条目,过滤会让它失去一键入口。

顺带把 graphify-out/ 加进 .gitignore,它是 29MB 产物且位于 Java
源根下,git add -A 会把它提交进源码树。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 22:25:08 +08:00
Silent1566
c64632637f
Merge pull request #152 from Silent1566/dev4
修复:TV选源网格边缘左右键翻组跳错组或翻不动
2026-08-23 21:31:09 +08:00
Silent1566
d1bce700d3 修复:TV选源网格边缘左右键翻组跳错组或翻不动
网格 item 原先只处理 DPAD_UP,左右键落到系统默认 focusSearch,
按几何位置在视图树里找最近可聚焦 View,往往命中分组标签行里偏右
的标签并触发其 focus 监听换组,表现为跳到无关分组(综合→有声);
另一侧找不到目标则事件被丢弃,表现为翻不动。

改为由 SiteAdapter 新增 onItemKeyHorizontal 回调交给 SiteDialog
处理:按 position % 3 判断行边缘(右边缘含末行不满时的最后一项),
命中后按分组标签的索引顺序前后移动一格,再把焦点落到新列表首项。

- 新增 groupSwitching 标志,在换组期间抑制分组标签的 focus 监听,
  避免 notifyDataSetChanged 回收持焦 item 时焦点中转引发二次换组;
  该标志在 focusFirstSite 各早退分支及 resetGroupReorderState 中复位。
- focusFirstSite 用嵌套两层 post + findViewHolderForLayoutPosition,
  绕开 mDataSetHasChangedAfterLayout 期间 findViewHolderForAdapterPosition
  必返 null 的问题;取不到 holder 时回退聚焦分组标签而非 recycler 自身。
- selectGroup 中 centerGroup 改为无条件调用,保证左翻回“全部”时标签行
  仍会滚动;moveGroupFocus 中重复的 centerGroup 调用一并删除。
- 长按进入分组排序模式时不接管左右键;action 模式下右侧有按钮列,
  右键仍让位给按钮列。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 21:27:18 +08:00
Silent1566
4729da333f
Merge pull request #151 from Silent1566/dev2
修复:TV版首页菜单键「选项弹窗」一直失效,实际弹出的是切换站源
2026-08-23 20:11:24 +08:00
Silent1566
cb69e277f1 优化:菜单键选项弹窗条目加自适应字号,避免英文文案被截断
英文 locale 下最长文案 Select dialog / Change config 为 13 字符,18sp 约
117dp;在低 dp 宽度电视上(1280x720 @density 1.5)三列净列宽约 107dp,
会被 ellipsize="middle" 截断成 Chang…onfig。中文 4 字不受影响。

按 dialog_config.xml 按钮的既有写法加 autoSize 兜底(18sp 起、最小 14sp),
宽度不足时缩字而非截断。同时补上根节点缺失的 xmlns:app 声明。

验证:processLeanbackArm64_v8aDebugResources 与
compileLeanbackArm64_v8aDebugJavaWithJavac 通过;
HomeMenuDialogSourceTest 4 项断言全部通过(新增 2 条锁住 autoSize 配置)。
真机不同密度下的实际显示效果仍未验证。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 20:05:52 +08:00
Silent1566
3b448f535a 优化:首页菜单键选项弹窗改为三列网格,避免 9 项需要滚动
上一版用单列列表,9 个条目约 536dp 超过 maxHeight 352dp,要滚动才能看全。
参考 OK影视 5.1.6 的做法改成三列网格:3 行 40dp + 2 段 16dp 行距 +
上下 padding 48dp 共 200dp,一屏显示完。窗口宽度同步 0.4f -> 0.6f,
与参考实现的 0.2f*3 一致。

列数统一由 dialog_home_menu.xml 的 spanCount 声明,Java 侧只设与之对齐的
SpaceItemDecoration 间距,避免 XML 与代码两处重复创建 LayoutManager。
条目宽度改为 0dp + weight=1 以撑满网格列宽。

验证:compileLeanbackArm64_v8aDebugJavaWithJavac 通过;
HomeMenuDialogSourceTest 4 项断言全部通过(新增 3 条锁住网格配置)。
真机焦点与视觉效果仍未验证。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 19:26:28 +08:00
www.xueximeng.com
b2eccc3576 docs: establish stable upstream task records 2026-08-23 18:59:51 +08:00
Silent1566
e95b90d3a8 修复:TV版首页菜单键「选项弹窗」一直失效,实际弹出的是切换站源
HomeActivity.onHomeMenuKey() 的 switch 里缺少 case 0,落到
default -> showDialog(),而 showDialog() 就是 SiteDialog.create().show(this),
所以首页菜单键设为默认的「选项弹窗」时永远只出站源列表。

参考 OK影视 5.1.6 的做法补上真正的选项弹窗:新增 HomeMenuDialog,
条目取 select_home_menu_key 去掉第 0 项,点第 n 项执行下标 n+1 的动作。
动作分发从 onHomeMenuKey() 抽成 onHomeMenuItem(int),index 1..9 行为不变。

同时加了三处防御:
- position 为 NO_POSITION 时直接返回,否则 position + 1 == 0 会递归弹出本弹窗
- show() 前检查已有实例,菜单键连按不会叠开多个弹窗
- 进程恢复后 listener 丢失时回退到宿主 Activity,避免点击无响应

弹窗样式复用 shape_config_history_dialog 与 selector_config_history_item,
与历史弹窗保持一致的焦点表现。

验证:compileLeanbackArm64_v8aDebugJavaWithJavac 通过;
新增 HomeMenuDialogSourceTest 4 项断言全部通过。
(MpvPreloadControllerTest 的 2 项失败为合并 origin/beta 带入的既存问题,
与本改动无关,已在干净工作区复现确认。)
弹窗焦点与视觉效果未在真机验证。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 18:54:52 +08:00
Silent1566
3469411913
Merge pull request #150 from Silent1566/TV版季度按钮无法选中
修复:语音广告识别全链路失效
2026-08-23 16:43:17 +08:00
Silent1566
532be2d7ed 修复:语音广告识别全链路失效
语音去广在此前从未真正运行过。逐环定位并修复五处缺陷,每处都有先失败后通过的回归测试:

1. UI 绑定竞态:isOwner() 在 onServiceConnected/onResume 时为 false,两次绑定
   全部落空且无补绑路径,运行时始终 ui==null 而停用所有 provider。改为在
   onPlaybackStateChanged 取得所有权后补绑。
2. bindUi 非幂等:重建 coordinator 会让已运行的 provider 变成孤儿,其候选被
   coordinator != currentCoordinator 守卫静默丢弃。同一 UiPort 重绑时改为复用。
3. 候选时间基错误:onRecognitionResult 读取缓存的 hostPosition,而它仅在
   bind/refresh/READY 时发布,稳态播放期间陈旧达数分钟。改用识别器已经回传的
   采集时间戳,并移除 provider 侧的时长钳制,由 AdSkipCoordinator 统一钳制。
4. IDLE 销毁识别器:缓冲导致位置暂时不可用时释放识别器和采集租约,每次缓冲
   抖动都重建 sherpa。改为停泊保活,isActiveLocked 将 IDLE 视为存活,并校验
   会话 id 以免持有失效会话的租约。
5. 缺少位置泵:host position 无周期性推送,provider 启动后即停滞。挂到已有的
   5 秒播放遥测心跳上。

另:邮箱容量 8 提升至 16(48 kHz 下 1 秒内即溢出);忽略抑制键加入匹配区间,
此前所有语音候选共用 ruleId,一次忽略会静音整代后续提示。

新增受调试日志开关控制的诊断输出,用于定位上述问题。record() 的日志在锁外
并做采样:SpiderDebug 写日志是同步磁盘 IO,而 STALE_GENERATION/QUEUE_OVERFLOW
可能每个 PCM 帧触发一次,且调用方位于 ExoPlayer 音频线程。日志只输出状态、
计数和时间戳,不含识别文本、关键词、URL 与请求头。

音频管线重建加入每会话次数上限:refreshAdAudioRuntime 现由 5 秒心跳驱动,而
rebuildAudioPipeline 是完整的播放器重启,音频直通等配置下租约永远无法满足,
不设上限会导致每 5 秒重启一次播放。

同时补齐合并 beta 后缺失的 import(AlertDialog、LightDialog、
MaterialAlertDialogBuilder),此前两个设置页无法编译。

验证:Leanback 全量单测 461 类 2775 项通过,Mobile ARM64 编译通过。
MpvPreloadControllerTest 的 2 项失败随 beta 合并引入,与本次改动无关
(stash 全部改动后仍失败)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 16:27:50 +08:00
Silent1566
a4a2cee00f
Merge pull request #149 from Silent1566/dev2
修复:应用图标改版漏了应用内 logo、通知栏图标与网页 favicon
2026-08-23 15:51:29 +08:00
Silent1566
49d9c5370d Merge remote-tracking branch 'origin/beta' into dev2 2026-08-23 15:41:05 +08:00
Silent1566
5c4dafe09e 修复:应用图标改版漏了应用内 logo、通知栏图标与网页 favicon
上一版重做图标(1e5b1384)只覆盖了启动器图标、TV 横幅和 Play 商店图,
另外三处承载 App 形象的资源没跟上,桌面已经是 MO 字标,应用内标题栏、
通知栏和网页管理端还是 2026-05 的旧立方体线框,同一个 App 两种标识。

补齐的三处,全部纳入 scripts/gen_app_icon.py 统一生成,不新增手工资源:

- ic_logo.png(手机版标题栏 / 电视版首页左上)
  用圆形而非圆角方形:ImgUtil.logo() 对远端 logo 做了 circleCrop(),
  本地兜底图必须同为圆形,否则配置里带 logo 时形状会跳变。
- ic_notification(anydpi 矢量 + mdpi..xxhdpi 位图)
  白色剪影 + 全透明底。Android 5.0+ 只取 alpha 通道重染,沿用带渐变底的
  图标会让整个方块都是非零 alpha,重染后变成一个纯色实心方块。
  填充比另设 FILL_NOTIFY=0.88:24px 下 M 竖干 2.27px,达到通知图标 2dp
  最小笔画;再放大边缘会贴到 24dp 边界被状态栏裁掉。
- favicon.ico(网页管理端)
  沿用原三帧规格 16/32/48,逐帧独立超采样渲染。交给 PIL 用 sizes= 缩放
  会让小帧由最大帧降采样、笔画糊成一团。

同时新增小尺寸降级:低于 WORDMARK_MIN_PX=32 就丢掉 M、只留 O 播放徽章。
16px 下 M 竖干只有 1.10px,抗锯齿后是一团灰,连"有两个字母"都读不出;
只留 O 时环厚 2.22px,且环厚/直径与字标里的 O 完全相同(0.20384),
两种形态字重一致。当前只有 16px favicon 帧走这条路径。

顺带把脚本里硬编码的两处 fill=0.64 提成 FILL_CIRCLE,并在文件头列出全部
六类落点,注明改图标必须整套重跑——这次遗漏就是因为清单只存在于上次的
提交说明里。

验证:
- mobile / leanback 两个 flavor 的 processResources 均通过
- 10 个启动器位图与 HEAD 逐字节一致,降级阈值未波及任何既有输出
- 通知位图四档确认纯白 RGB + alpha 渐变,内容框未越界
- favicon 三帧逐像素等于对应尺寸的原生渲染,非降采样;FAVICON_SIZES
  乱序输入也仍输出完整三帧
- ic_notification.xml 与脚本输出逐字符一致,无 android:tint 空操作
- ic_logo.png 600x600、四角全透明、不透明占比 0.777(圆形)
- 全仓扫描:已发布图标资源无一残留旧立方体配色

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 15:37:07 +08:00
Silent1566
0587fa1043
Merge pull request #148 from Silent1566/dev1
统一电视端焦点框配色为黄色,绿色只表示当前生效
2026-08-23 14:57:19 +08:00
Silent1566
e5761b9818 统一电视端焦点框配色为黄色,绿色只表示当前生效
电视端详情页与选集浮层此前有六套并存的焦点配色:详情页 chip 走 applyChipFocus
的黄框,选集浮层的线路/季度/分段按钮走 selector_video_item 的白框,沉浸融合与
详情直放模式的浮层焦点态和生效态同用 colors.accent 绿色、根本分不出焦点在哪,
手机端弹层则是另一套蓝色系。用户反馈黄绿白混搭,无法判断哪个是焦点、哪个是
当前播放。

统一约定:焦点框 #FFD166 黄,当前生效 #2CC56F 绿。

改动:
- selector_video_item 焦点描边由 @color/white 改为 #FFD166,覆盖选集浮层的
  线路、季度、分段、文本选集与清晰度按钮
- applyNativeEnhancedInlineChipState 焦点描边由 colors.accent 改为 FOCUS_STROKE,
  修复沉浸融合/详情直放浮层焦点态与生效态同色无法区分的问题
- applyEpisodeDialogPageState、applyEpisodeDialogIconState、
  applyInlineEpisodeModeButtonState 三处蓝色焦点框改为黄色
- setActiveStrokeColor 由 0xFF2AA46B 归一到 0xFF2CC56F
- shape_episode_photo_focused 由 #FFD700 归一到 #FFD166

未改 selector_video_item 的 state_selected:该 selector 的消费方布局都带
ellipsize="marquee",而跑马灯只在 selected 或 focused 时滚动,EpisodeAdapter
因此写成 setSelected(isSelected() || hasFocus()),VideoActivity 的 shortDisplay
也用它表达"精简标题"开关态。给这个状态加描边会把正在滚动的长标题和开关态误标
成当前播放,已在文件内注释说明。生效态统一走 state_activated。

未改 @color/text 的黄色生效态文字:被直播频道、分组、EPG、站点弹窗等 12 个布局
共用,超出播放器域,需要时应另建一份 color selector。

selector_episode_dialog_page 与 selector_episode_dialog_item 的蓝色系保持原样:
唯一消费者 EpisodeDialog 无外部调用点,属死代码,清理另行处理。

验证:合并 origin/beta 后 leanback 变体编译通过,mobile 3483 项、leanback 2725 项
单测均仅 MpvPreloadControllerTest 的 2 项失败,在合并前的干净基线上重跑为同样 2 项
失败,属既有问题。TmdbDetailActivityLayoutTest 的配色断言已同步。实机效果尚未确认,
其中 leanback 侧焦点与生效态的叠加表现需上机复核。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 14:52:55 +08:00
Silent1566
4b88443eba
Merge pull request #147 from Silent1566/dev4
修复:设置面板改短显后铅笔图标不刷新
2026-08-23 14:41:38 +08:00
Silent1566
38d2fa7d70 修复:设置面板改短显后铅笔图标不刷新
上一提交让铅笔按钮的图标承载 isCompactEpisodeTitle() 状态后,暴露出
一条绕过同步的入口:播放设置面板 ControlDialog 的「短显」按钮走
onCompactEpisodeTitleChanged(),该回调只调 refreshEpisodeTitles(),
而这条路径不经过 updateEpisodeFileNameButton()(refreshTitles() 分支
不涉及,setEpisodeItems() 只刷新列表/网格按钮),导致标题已变短但
铅笔图标仍停在「完整标题」样式。

改为先调 setShortDisplay() 再 refreshEpisodeTitles(),与 onShortDisplay()
对齐。ControlDialog 在回调前已写入设置,故读到的是新值。

顺带修掉一个旧问题:这条路径原本也没有同步详情页「短显」按钮的
高亮态,setShortDisplay() 一并覆盖。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 14:26:39 +08:00
Silent1566
87cdb155fc 优化:选集面板按钮图标改为反映当前状态
排序、名称显示、列表/网格三个按钮原本无法从图标看出当前状态:
排序按钮图标恒为双向箭头 ic_action_reverse,只改无障碍描述;名称
按钮压根不设置图标;列表/网格虽会换图标,但语义是「点击后变成
什么」,导致网格模式显示四宫格图标、列表模式显示列表图标,与
实际效果相反。

统一为「图标 = 当前状态,无障碍描述 = 点击后的动作」:
- 排序:正序 ic_action_sort_asc(箭头朝下 + 横线短到长),
  倒序 ic_action_sort_desc(箭头朝上 + 横线长到短)
- 名称:短标题 ic_action_name_short(方框内单行),
  完整标题 ic_action_name_full(方框内三行)
- 视图:网格 ic_site_grid,列表 ic_site_list

新增 4 个矢量图标置于 main 源集,两个 flavor 共用。图标不带
android:tint 硬编码,与同栏 ic_site_grid/ic_site_list 写法一致,
不干扰 Fusion 主题的 setColorFilter 重新着色。排序图标用「箭头 +
横线长度递变」双重编码,20dp 下箭头细节模糊时仍可辨方向。

顺带修复原生模式铅笔按钮点击后图标不刷新:该路径走
onShortDisplay(),原本不更新按钮。改为在 setShortDisplay() 内同步,
使「短显」按钮与铅笔按钮共享状态源,两个入口任一都会同步。

六处布局的默认图标一并对齐各设置项默认值,避免首帧闪错。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 13:53:37 +08:00
www.xueximeng.com
61410e1f25 fix(exo): preserve DV7 access units for HDR10 fallback
Verification: DolbyVisionP81ExtractorsFactoryTest passed; :app:compileMobileArm64_v8aDebugJavaWithJavac passed; phone trace p-adb4r3-4 showed 169MB read and c2.qti.hevc.decoder with zero first frame after stripped HDR10 AUs; ADB reconnect refused so device install/replay remains pending
Task-Guard: exo-dv7-hdr10-renderer-fallback
2026-08-23 13:34:02 +08:00
www.xueximeng.com
8ecaea79c1 docs: decouple build instructions from Android Studio
Verification: git diff --check; exact active-doc scan confirms no Android Studio/JBR build dependency wording; scripts use JAVA_HOME/PATH and ANDROID_HOME/ANDROID_SDK_ROOT/local.properties
Task-Guard: remove-android-studio-build-dependency
2026-08-23 13:07:32 +08:00
www.xueximeng.com
24c7fff6d1 fix(exo): retain DV7 P8.1 fallback evidence
Verification: :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.player.exo.DolbyVisionP81ExtractorsFactoryTest BUILD SUCCESSFUL
Task-Guard: exo-dv7-p81-attempt-evidence-20260823
2026-08-23 12:58:50 +08:00
www.xueximeng.com
0141e9ad34 fix(exo): retry failed DV7 P8.1 as HDR10
Verification: :app:compileMobileArm64_v8aDebugJavaWithJavac BUILD SUCCESSFUL
Task-Guard: exo-dv7-runtime-fallback-gate-20260823
2026-08-23 12:54:09 +08:00
www.xueximeng.com
141e075e06 fix(exo): choose HDR10 when DV7 P8.1 is unsupported
Verification: bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.player.exo.DolbyVisionP81ExtractorsFactoryTest (BUILD SUCCESSFUL); git diff --check
Task-Guard: exo-dv7-p81-auto-hdr10-fallback-20260823
2026-08-23 11:54:59 +08:00
Silent1566
8254a3d9e0 Merge remote-tracking branch 'origin/beta' into TV版季度按钮无法选中
# Conflicts:
#	app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingEnhanceActivity.java
#	app/src/leanback/res/layout/activity_setting_enhance.xml
#	app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingEnhanceFragment.java
#	app/src/mobile/res/layout/fragment_setting_enhance.xml
2026-08-23 11:19:15 +08:00
www.xueximeng.com
8c6567adff exo: scope deferred Cues to remote Matroska inputs; Preserve local files and DV RPU behavior while enabling deferred Cues only for HTTP/HTTPS URIs; Assessment: docs/exo-startup-performance-assessment-2026-08-22.md#checkpoint-6
Verification: Mobile/Leanback Arm64 Java compile and DolbyVisionP81ExtractorsFactoryTest passed in candidate artifact unit; URI-scoped deferred gate and no-global-flag checks passed; media-lock JSON valid; verify_upstream_checkpoint.sh passed; git diff --check
Task-Guard: exo-sp2-deferred-cues-app-gate-20260823
2026-08-23 10:34:04 +08:00
www.xueximeng.com
71514fdb10 exo: install deferred Cues extractor artifact; Media3 artifact: androidx.media3:media3-extractor:1.11.0-alpha01-fongmi; AAR-SHA256: ec3ac41088e496bdfe63925ca0751234e0178a9d92e8deedf8734dfe36fab8fe; Sources-SHA256: a9a813622f10b4735f71ba3c8e535981adca4941bd0f6d832efe31e80b033295; Assessment: docs/exo-startup-performance-assessment-2026-08-22.md#checkpoint-6
Verification: App Mobile/Leanback Arm64 Java compile and DV extractor unit test passed; extractor AAR publish BUILD SUCCESSFUL; module/AAR/sources metadata and SHA-256 sidecars match; POM unchanged; git diff --check
Task-Guard: exo-sp2-deferred-cues-artifact-20260823
2026-08-23 10:31:55 +08:00
www.xueximeng.com
fb2a9ab839 exo: stage deferred Matroska Cues extractor patch; Upstream-Source: androidx/media@859f7b3b53; Assessment: docs/exo-startup-performance-assessment-2026-08-22.md#checkpoint-5
Verification: Media3 isolated checkout: lib-extractor compileDebugJavaWithJavac; MatroskaExtractorNonParameterizedTest; lib-extractor publishReleasePublicationToMavenRepository; clean-baseline patch apply check; bash -n scripts/build_media_deps.sh; git diff --check
Task-Guard: exo-sp2-defer-cues-implementation-20260822
2026-08-23 10:17:13 +08:00
Silent1566
f130152914
Merge pull request #146 from Silent1566/dev2
修复:MPV 播放先出声后出画面
2026-08-23 01:58:02 +08:00
Silent1566
6a458ec11c 修复:MPV 播放先出声后出画面
上游合并 45a72e2d97 引入的「输出快门」在本仓库是纯等待:
PlaybackActivity.syncShutter() 会在自动输出决策完成前把视频
SurfaceView 的 alpha 置 0,音频不受影响,于是声画分离。

但本地 SURFACE_AUTO_STABILITY_GUARD_ENABLED 硬编码为 true,
使 isAutoSurfaceDirectEnabled() 恒为 false、自动模式恒走 GPU,
永不存在需要遮挡的「直出探测帧」;零拷贝黑名单设备同理,
resolveSurfaceDirect() 对其在所有模式下都拒绝直出。快门因此
只是白等一个结论早已注定的决策。模拟器实测 start-file 到
playback-restart 相隔 4.34s,其间音频在 37.834 就绪、画面要
等到 38.813;探测另有 attempts=20 跑满 5s 的空转。

三处改动:
- shouldKeepVideoShutterClosed() 增加 isAutoSurfaceDirectEnabled()
  判据,无法抵达直出时不再关快门;guard 放开后自动恢复遮挡。
- prepareMpvOutputForNewItem() 改用同一判据。syncShutter 里
  keepClosed 是 nativeOutputPending || 谓词 的或关系,只改谓词
  会被 pending 旁路。
- 探测耗尽时释放快门。新增 mpvAutoOutputProbeGaveUp 让谓词与
  pending 两侧同时释放——只调 onPlayerOutputReady() 仅清 pending,
  谓词仍为 true,快门实际不会打开(首轮评审发现)。刻意不置
  mpvAutoOutputEvaluated,否则会永久停掉本片后续自动决策。

未修复的既有问题(不属本次回归,另行处理):硬解失败后 mpv 报
vid=no,而探测判据要求轨道就绪,导致 tracksEmpty=true 必然跑满
20 次。

验证:leanback / mobile 两变体编译通过;全量单元测试
3483(mobile) / 2725(leanback) 例中仅 MpvPreloadControllerTest
2 例失败,该失败在剥离本次改动的同一基线上同样存在,源自 08-19
上游 d41abf83c5 未同步断言,非本次引入。新增的 5 条源码断言逐条
注入回归实测有效(含 latch 与回调的顺序约束)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 01:50:46 +08:00
Silent1566
5a4d2ab12f
Merge pull request #145 from Silent1566/dev4
修复:影视原生模式选集名称修改按钮无作用,改为等同短显
2026-08-23 00:50:15 +08:00
github-actions[bot]
5eb074c7c0 Merge commit '247c8f807a' 2026-08-23 00:43:48 +08:00
Silent1566
0ef28f60c8 修复:影视原生模式选集名称修改按钮无作用,改为等同短显
手机端详情页选集区的铅笔按钮(episodeFileName)原本只翻转
tmdb_episode_show_scraped_name,而该开关仅在剧集带 TMDB 数据时
才参与标题生成,影视原生模式不加载 TMDB,导致点击毫无反应。

改为在影视原生模式下走 onShortDisplay(),效果与「短显」按钮一致,
并把无障碍描述同步改为「短显」。其余 TMDB 模式逻辑不变。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-23 00:40:28 +08:00
www.xueximeng.com
3aae091dbb docs: finalize Exo deferred Cues assessment
Verification: E-SP2 深度研究与方案冻结完成;verify_upstream_checkpoint.sh 通过;git diff --check 通过
Task-Guard: exo-sp2-defer-cues-assessment-20260822
2026-08-22 23:25:47 +08:00
Silent1566
233b46f833
Merge pull request #144 from Silent1566/dev3
修复:电视版更新弹窗看不到网速与按钮,改为铺满全屏
2026-08-22 23:20:07 +08:00
Silent1566
fbb6e18bc4 Merge branch 'beta' of https://github.com/Silent1566/webhtv into dev3 2026-08-22 23:18:02 +08:00
Silent1566
eb863962d7 修复:电视版更新弹窗看不到网速与按钮,改为铺满全屏
用户反馈电视版"版本更新"弹窗在下载时看不到网速、也看不出是否在下载,
且只有部分设备复现。根因是弹窗底部的进度面板和取消按钮被裁掉。

原实现手算窗口精确高度再 window.setLayout() 写死,需要同时算对屏宽高、
content 高度、visibleFrame、systemBars inset、Material 背景 inset 和
chrome 高度共七个变量,每项都有设备差异,任何一项出错就裁掉底部内容。

其中两项确实在出错:

一是 configureWindow() 连续两次用同一组 measure spec 调 root.measure(),
中间只改 LayoutParams.height 字段而没走 setLayoutParams,不触发
requestLayout。PFLAG_FORCE_LAYOUT 在第一次 measure 末尾即被清除,第二次
命中 View.measure() 的缓存短路,窗口高度实际按"列表 1px"算出,比内容矮
整整一个列表高度(1080p 约 452px、720p 约 287px)。

二是 Material 的对话框背景 inset 有按屏高分档的资源限定符:values 下是
10dp,values-h480dp-v13 下上下各 80dp。屏高 ≥480dp 时命中后者,绝大多数
电视都在这一档,而 720p@2.0、1080p@3.0 等只拿 10dp——同一份 APK 相差
八倍,这解释了为何只有部分用户复现。原 clearWindowInset() 想用
ColorDrawable 覆盖窗口背景来清掉它,但 ColorDrawable.getPadding() 返回
false,setBackgroundDrawable 不会重置已有 padding,inset 只是变得不可见
而没有消失。

改为电视端铺满全屏,让 LinearLayout 分配空间取代手算:滚动区用
layout_weight 吃剩余空间,进度面板和按钮作为固定高子项在结构上不可能
再被裁掉。七个变量降为零。同时覆盖 alertDialogStyle 把 inset 归零——
inset 以 alertDialogStyle 作为 defStyleAttr 读取,优先级高于主题属性,
写在 ThemeOverlay 上会被 MaterialAlertDialog.Material3 压掉。

一并全屏化同样在手算尺寸的关于弹窗与 GitHub 代理弹窗。关于弹窗位于 main
源集,用 Util.isLeanback() 门控,手机端行为不变;它此前也存在同源的
measure 短路问题。代理弹窗补上缺失的 softInputMode:它有 URL 输入框,
小窗时系统还能上推窗口避让键盘,铺满后没有余量,需显式 ADJUST_RESIZE。

顺带移除因全屏而失效的逻辑:按进度面板高度重设窗口会随下载文案逐秒变长
变短而抖动;getProgressPanelHeight() 在窗口未 layout 时读到的是从未参与
measure 的 GONE 视图,只有 marginTop 而非真实高度。

未改动确认框类弹窗(如备份确认),它们只有两行字加按钮,全屏反而突兀。
AdRuleManageDialog 等虽也自行设置尺寸,但用的是 WRAP_CONTENT 而非写死
精确高度,不会踩此坑,且无用户报障,故不扩大范围。

注:本次仅通过编译与单元测试验证,尚未真机验证全屏观感(安全边距取
32dp、列表滚动步长仍为 96dp,可能需按实机调整)。UpdateDialogLayout
及其测试现已无生产代码引用,暂予保留。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 23:14:45 +08:00
Silent1566
c8996284ed
Merge pull request #143 from Silent1566/dev4
重做应用图标
2026-08-22 22:51:49 +08:00
Silent1566
9d84d9b5d8 Merge remote-tracking branch 'origin/beta' into dev4 2026-08-22 22:46:29 +08:00
www.xueximeng.com
c07e2b27ed fix(exo): reveal video after first rendered frame
Verification: Mobile/Leanback Arm64 Java compile BUILD SUCCESSFUL; git diff --check
Task-Guard: exo-sp1-first-frame-visible-20260822
2026-08-22 22:43:44 +08:00
Silent1566
b84e6fcd20
Merge pull request #142 from Silent1566/dev1
修复:电视端加载中网速与屏显网速在右下角重叠
2026-08-22 22:42:54 +08:00
Silent1566
1e5b138400 优化:重做应用图标,避免与同类影视应用撞脸
原图标是白底浅色立方体线框,与桌面上 OK影视/PickTV/影视+ 等多个应用
几乎无法区分,只能靠记位置分辨。

新图标从三处拉开差异:
- 宝蓝到亮蓝的对角渐变实心底,深色块在一屏浅色图标里唯一
- 满版 MO 字标(对应「默影视」),一屏立方体图形里唯一的文字型图标
- O 兼作播放键,内嵌三角点出影视属性

亮度由两条对比度约束夹定,不可随意调整:
- 图标中间调对深色桌面需 >= 3:1,否则糊成一片(实测 3.17:1)
- 白字标压在渐变最亮点需 >= 3:1(WCAG 1.4.11 图形阈值,非正文的
  4.5:1;实测 3.08:1)

渐变端点按各外形的真实可见范围内缩:启动器只显示 108dp 画布中央的
72dp,端点若落在画布对角顶点会被裁掉,可见部分只剩中段而退化为近似
平色。配 tileMode="clamp" 使可见区跨满完整色域。

O 直径取字高的 1.25 倍:等于字高时 O 的字怀在 48px 下仅约 5px,
塞不进能读出形状的三角。放大后环厚与 M 竖干只差 2%,字重仍匹配。

新增 scripts/gen_app_icon.py 作为唯一图标来源,字形按几何参数自绘,
不依赖系统字体,改配色或比例只需调文件头常量后重跑。同时新增
ic_launcher_monochrome.xml 支持 Android 13+ 主题图标。

验证:矢量路径光栅化后与位图像素级一致(19113 墨迹像素 0 处不匹配);
18 个资源通过 AAPT2 编译;mobile/leanback 两个 flavor 的
processResources 均通过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 22:41:47 +08:00
Silent1566
2822c91db9 修复:电视端加载中网速与屏显网速在右下角重叠
电视端加载遮罩的网速读数原先锚在右下角(bottom|end + 24dp
边距),与 OSD 屏显的 osdBottomRight(同为右下角、14dp 内边距)
只差 10dp,叠成上下两行;两者各跑一套 PlaybackSpeedMeter,
基线与采样相位互不相干,因此显示的数值也不一致。

改为对齐 mobile 版既有做法,挪到转圈指示器下方居中。
marginTop 取 44dp 而非照抄 mobile 的 40dp,因电视端字号为
16sp(mobile 12sp),据此换算后视觉间距与 mobile 一致(约 13dp)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 22:27:39 +08:00
www.xueximeng.com
daac1be72d docs: clarify Exo assessment provenance
Verification: corrected assessment wording; git diff --check; production code and dependency locks unchanged
Task-Guard: exo-startup-performance-assessment-doc-correction-20260822
2026-08-22 22:03:04 +08:00
www.xueximeng.com
9c69c800dd docs: assess Exo startup performance options
Verification: docs/exo-startup-performance-assessment-2026-08-22.md; git diff --check; verify_upstream_checkpoint.sh passed; no production code changed
Task-Guard: exo-startup-performance-assessment-20260822
2026-08-22 22:01:50 +08:00
www.xueximeng.com
f2721c43b6 fix(exo): stop startup timeout after first video frame
Verification: focused Exo unit test DolbyVisionP81ExtractorsFactoryTest; git diff --check
Task-Guard: exo-dv7-timeout-after-first-frame
2026-08-22 21:27:42 +08:00
www.xueximeng.com
4b593ef8c5 fix(exo): fallback to HDR10 after DV7 first-frame timeout
Verification: DolbyVisionP81ExtractorsFactoryTest passed; git diff --check passed
Task-Guard: exo-dv7-first-frame-timeout-fallback
2026-08-22 20:52:44 +08:00
www.xueximeng.com
2cb52089ce fix(exo): preserve DV7 HDR10 fallback across rebuild
Verification: DolbyVisionP81ExtractorsFactoryTest passed; git diff --check passed; fallback matching changed from PlaySpec identity to trace/key/URL
Task-Guard: exo-dv7-playback-failure
2026-08-22 20:28:14 +08:00
Silent1566
41e66fc379
Merge pull request #141 from Silent1566/dev2
修复:电视端播放器选集浮层末行不满时下键卡住
2026-08-22 19:28:50 +08:00
Silent1566
0779a3948e Merge remote-tracking branch 'origin/beta' into dev2 2026-08-22 17:59:03 +08:00
Silent1566
7086682daf 修复:电视端播放器选集浮层末行不满时下键卡住
原生增强模式的播放器选集浮层用 3 列 VerticalGridView 排 TMDB 卡片。末行不满
时,停在上一行右侧列的焦点正下方是空格,Leanback 原生焦点搜索找不到同列候选
就不动,必须先横向挪到有卡片的列才能继续下移。

onEpisodeKey 原先只处理上键(首行回分段栏),下键没有任何分支。详情页内联网格
早已用 TmdbEpisodeGridPolicy.verticalFocusTarget 把越界目标夹到最后一项,浮层
漏了这份兜底,两处行为不一致。

改动:下键先判断正下方是否真有卡片,有则照旧交给 Leanback 逐行移动,仅在末行
不满时复用同一个 verticalFocusTarget 跳到最后一集,避免两套网格导航逻辑分叉。

验证:leanback flavor 编译通过,2721 项单测中仅 MpvPreloadControllerTest 的 2 项
失败;stash 改动后在干净基线上重跑为同样 2 项失败,属既有问题。新增测试锁定浮层
下键路由与 3 列末行只剩 1 集的场景。实机效果尚未确认。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 17:58:26 +08:00
www.xueximeng.com
2c48c7eb2c Record Exo DV CSD compatibility recovery point
Verification: documentation records exact verified commit and recovery tag
Task-Guard: exo-dv7-p81-csd-record
2026-08-22 17:10:30 +08:00
www.xueximeng.com
5e264c409d Fix Exo DV7 to P8.1 CSD compatibility
Verification: DolbyVisionP81ExtractorsFactoryTest: 13 tests passed; git diff --check passed; device ADB unavailable, target-TV首帧回归 pending
Task-Guard: exo-dv7-p81-csd-compat
2026-08-22 17:09:28 +08:00
Silent1566
3945580e6a
Merge pull request #139 from Silent1566/dev1
修复:播放器选集卡片混排、跨季刮削与季度切换
2026-08-22 16:59:51 +08:00
Silent1566
60eab8ce89 Merge remote-tracking branch 'origin/beta' into dev1
# Conflicts:
#	app/src/main/java/com/fongmi/android/tv/ui/helper/TmdbUIAdapter.java
2026-08-22 16:51:00 +08:00
Silent1566
2bad6fa6d1
Merge pull request #140 from Silent1566/dev2
修复:原生增强模式 TMDB 未匹配时回退为原生选集按钮网格
2026-08-22 16:00:00 +08:00
Silent1566
431502fc0d 修复:播放器选集卡片混排、跨季刮削与季度切换
选集界面原来卡片与文本按钮混排、布局错乱,根因是 view type 逐集判断而容器按
整体模式算固定行高。改为卡片模式下整列统一走卡片,缺 TMDB 数据的集降级绑定
(隐藏图层、剧集海报兜底、隐藏徽标),外框尺寸保持一致。

选集弹层两端都自建 EpisodeAdapter 却从不设置 fallbackStillUrl,无 TMDB 数据的
集永远无图;补上 fallbackStill(...) 传参。兜底图取图顺序对齐详情页(海报优先)。

源站不分季的长番(航海王 1114 集 vs TMDB 24 季)跨季匹配不上,有三处原因:
- intent 带来的 season 会短路 TmdbSeasonResolver 的多季解析,富化退化为单季路径。
  Source.REQUEST 时重算一次不带 requestSeason 的解析,MULTI_SLICE 就改用切片结果。
- 只拉 availableSeasons 会漏季(手动分段绑定时它仅含 segments 涉及的季)。改为按
  源集数累加拉取实际覆盖到的季,并补上分段涉及的季;不拉全部可切分季,避免 23 季
  串行请求在冷缓存时拖到十几秒。
- 关键假设错误:TMDB 对这类长番是跨季连续编号(第 7 季 = 196-228 而非 1-33),
  按季内序号取键会整季落空。改为对该季集号排序后按位置取。

新增 EpisodeSeasonSegments 尽力切分策略:各季集数与源集数对不齐时(1114 vs ~1120)
仍能切分,多出来的集归入显式的"未匹配"分段而不是丢弃。选集弹层两端据此新增季度
按钮行,分段标签加季偏移显示全局集号,与详情页编号一致。TV 端遥控焦点链从三段
扩为四段(线路→季度→分段→选集),声明式 ID 与按键处理两套机制同口径。

顺带修复 applySegmentedEpisodeMetadata 用 setTmdbEpisode 存跨季数据,会清掉
tmdbEpisodeMapped 标记导致下次重绑被 matcher 否决。

评审发现并修复:
- 按位置贴元数据缺少一致性校验,某季集号有跳号时缺口之后每集都会挂上下一集的
  标题和剧照(错的数据比没有数据更糟且用户无法察觉)。加连续性判据整季放弃;
  判据用"前 width 个连续"而非"集数等于分段宽度",否则末季分段被裁短后永远被跳过。
- 分段标签加季偏移未区分正倒序,倒序时会覆盖成错误的正序编号。
- visibleEpisodes 回退完整列表时未清选中季,偏移会在已是全局编号的列表上再叠一次。

手机版实机验证:航海王选集元数据覆盖从 74/1114 提升到 1114/1114。
电视版仅通过编译与源码断言,遥控四段焦点链尚未实机验证。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 15:38:40 +08:00
Silent1566
5496583984 合并远端 beta 最新代码
冲突集中在 EpisodeDisplayPolicy 及其测试,两边都在改选集加载的等待判据:

- shouldWaitForTmdbEpisodes 采用 beta 版。本地改动只是把"刮削是否已返回"从
  严格集号校验换成非空校验,beta 更彻底:只要有任何可渲染的集数就不再占位,
  纯文本选集先上屏、卡片到达后原地替换。beta 的判据涵盖本地要解决的场景,
  因此删掉本地已无调用者的 hasTmdbEpisodePayload。
- 测试保留双方用例,本地那条改用 beta 的语义重新表述:集号对不上不代表没有
  可渲染的集数,不应把 loading 卡到超时。

本次改动的其余部分(按钮宽度自适应、跨季映射 mapped 标记、回退列数尊重用户
设置)与 beta 无重叠,自动合并后均已保留。

验证:mobile 3453 项单元测试通过,leanback 编译通过。MpvPreloadControllerTest
的 2 项失败来自 beta,已确认在不含本地改动的基线上同样失败。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 15:34:46 +08:00
Silent1566
9ade3c483c 修复:原生增强模式 TMDB 未匹配时回退为原生选集按钮网格
原生增强详情页在整季没有任何有效 TMDB 集号匹配时,不再显示一堆没有海报的
空增强卡片,改为回退到紧凑的原生选集按钮网格;整季只要有一个有效匹配就继续
使用增强卡片,不混排两种样式。

主要改动:
- EpisodeDisplayPolicy 拆成两个谓词:hasTmdbEpisodeData 按严格集号校验,决定
  是否使用增强卡片;hasTmdbEpisodePayload 只看数据是否已到,供加载等待判断。
  两者混用会让整季误匹配的季一直卡在 loading 直到超时。
- 文件大小徽标的横向占位改为按按钮实际宽度自适应。上游固定预留 96dp,在多列
  网格里会把标题挤成 0 宽(只剩徽标可见);宽度不足时改为徽标置顶、标题上方
  避让并允许两行。宽度未知时按放不下处理,标题空白比按钮偏高更难接受。
- 首帧 bind 早于 addView,此时拿不到 parent 和宽度,改为 onCreateViewHolder
  注入 RecyclerView,按可用宽度和列数估算并扣除装饰间距,布局落定后再复检。
- TmdbUIAdapter 两处跨季分段映射通过 shouldApplyMapped 校验后改用
  setMappedTmdbEpisode。原先的 setTmdbEpisode 会清掉 mapped 标记,导致源集号
  与本季集号不同的分段被严格匹配判为无效,丢弃已正确刮削的元数据。
- 回退网格的列数尊重用户的“长标题列数”设置,避免该设置在回退模式下可见可点
  但完全没有反应。

验证:mobile 3448 项、leanback 2721 项单元测试通过(MpvPreloadControllerTest
的 2 项失败在合并 beta 后的基线上同样存在,与本次改动无关),两个 flavor 编译
和 mobile debug APK 构建均通过。选集按钮的实机视觉效果尚未截图确认。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 14:59:14 +08:00
www.xueximeng.com
c49c13759b fix(exo): feed pure HDR10 data after DV7 runtime failure
Verification: bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests 'com.fongmi.android.tv.player.exo.DolbyVisionP81ExtractorsFactoryTest' (BUILD SUCCESSFUL); git diff --check
Task-Guard: exo-dv7-runtime-clean-fallback
2026-08-22 14:57:06 +08:00
www.xueximeng.com
cf22878d9d fix(mpv): keep direct output for DV7 HDR10 fallback
Verification: bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests com.fongmi.android.tv.player.mpv.MpvAutoOutputPolicyTest (PASS)
Task-Guard: dv7-runtime-fallback
2026-08-22 13:37:44 +08:00
Silent1566
d3065738b9
Merge pull request #138 from Silent1566/dev3
修复:播放核心选择丢失的外调选项
2026-08-22 13:08:21 +08:00
Silent1566
15334c6d39
Merge pull request #137 from Silent1566/dev4
优化:原生增强详情页选集加载不再长时间转圈
2026-08-22 13:07:06 +08:00
Silent1566
0c3eab4d92 修复:播放核心选择丢失的外调选项
共享的 PlayerKernelDialog 只渲染 select_player_kernel 的四个内核,
接入它的界面因此没有了外调这一行,各自手写追加外调的 onChoose()
被留在文件里但已无人调用。手机版直播、电视版直播、电视版投屏、
电视版点播(短按)四处受影响。

在对话框一处补齐而非让四个界面各自退回原来的 AlertDialog:
新增可选的 ExternalListener,传了回调才在内核列表末尾追加外调行,
设置页不传则保持纯内核列表。选中该行直接分派外调,绕开
sanitizePlayer 的钳制——外调从来不是一种播放器类型,
硬塞进内核枚举只会被夹回 EXO。

顺带把外调文案从硬编码中文字面量收进 strings.xml,
补齐繁中与英文,原先这两种语言下也显示简体;
另外两处手写对话框的同样字面量一并资源化。

电视版点播的长按此前指向 onChoose(),改指原本就存在却没人用的
onPlayerKernelLong(),与手机版一致。

新增回归测试覆盖四个共享对话框界面,去掉外调回调可复现失败;
判据限定在方法体内,避免文件他处的无关匹配把断言撑成恒真。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 13:04:01 +08:00
Silent1566
385e603a77 优化:原生增强详情页选集加载不再长时间转圈
原生增强模式下选集区域会停在「正在加载剧集信息...」很久,TMDB 磁盘缓存
命中也一样,退出重进依旧。原因是两道与缓存无关的阻塞:

1. 选集元数据被排在 1200ms 的启动延迟之后,缓存再快也没用——请求还没发出。
   拆出 scheduleStartupEpisodeLoad 立即发起,推荐/个性化仍延后给首帧让路。
2. 站源集数已经拿到,却因为还没有 TMDB 元数据而把整个列表隐藏,最长等 15 秒。
   改为只在一集都没有时才占位,纯文本选集先上屏,卡片到达后原地替换。

并顺带补上两处让缓存真正生效的改动:

3. prefetch 只拉 detail+cast,不含选集卡片真正需要的 season。新增季预热,
   跑在独立任务里,避免阻塞 prefetch future 反而延后详情首屏。
4. 新增季级进程内缓存,切季/切线路不再重复读盘并解析整季 JSON。缓存在
   beginDetailRequest 清空,既不挡强制刷新,也不冲掉预热结果。

配套修正:
- 选集元数据改用独立的 largeExecutor 线程池。原先与推荐共用只有 3 条线程的
  recommendationExecutor,取消延迟后选集会排在推荐后面,反而更慢。
- 网格模式改为跟随「真有卡片数据」而非表头可见性。否则纯文本项会被塞进按
  卡片宽度算 spanCount 的网格,且切换按钮此时隐藏,用户切不回列表。
- 超时回退不再以占位符可见为前提,否则 fallbackReleased 永不置位,TMDB
  匹配失败时表头会永久挂着。
- 预热的季号在主线程从 Intent 读出后传入,不在后台线程访问 Bundle。
- 删除 updateFlag 中已无法命中的占位符淡入分支及其失去调用者的辅助方法。

测试:更新被行为变更影响的断言,新增防回归守卫(线程池归属、缓存清理时机、
预热不阻塞 future、网格判据、卡片升级路径),并为 likelySeasonNumber 补真
正的纯函数单测。守卫断言均已通过「重新引入 bug 时会失败」验证。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 12:57:43 +08:00
www.xueximeng.com
5a20ec9db9 docs(exo): record DV7 to P8.1 CSD recovery point\n\nRecord the verified implementation commit and immediate recovery tag for the Exo Dolby Vision CSD adaptation.\n\nImplementation: docs/upstream-player-dependency-a1-2-implementation-2026-08-22.md
Verification: Recorded the already verified implementation commit and recovery tag; no code or test changes
Task-Guard: exo-a1-2-record
2026-08-22 11:06:46 +08:00
www.xueximeng.com
9306df6afa fix(exo): keep DV7 to P8.1 codec and CSD aligned\n\nSynchronize the Dolby Vision configuration record with the existing Exo DV7 to P8.1 sample conversion. Preserve non-DV initialization data and keep the current converter policy unchanged.\n\nUpstream-Source: FFmpeg@177f090e0503b7e013922ca903bde14b1c375f18\nAssessment: docs/upstream-player-dependency-merge-assessment-2026-08-20.md#43.4\nImplementation: docs/upstream-player-dependency-a1-2-implementation-2026-08-22.md
Verification: bash ./gradlew :app:testMobileArm64_v8aDebugUnitTest --tests 'com.fongmi.android.tv.player.exo.DolbyVisionP81ExtractorsFactoryTest' (BUILD SUCCESSFUL)
Task-Guard: exo-a1-2-dv-csd
2026-08-22 10:33:34 +08:00
Silent1566
51e7a9cd8a Merge remote-tracking branch 'origin/beta' into dev2 2026-08-22 10:19:02 +08:00
Silent1566
8d89d20396
Merge pull request #136 from Silent1566/dev3
修复:加载完成后屏显网速卡在固定值不变
2026-08-22 10:14:03 +08:00
Silent1566
72faded186 测试:补齐计数器自证判据的覆盖并修正失实的断言注释
自查评审发现三处测试与实现不符或缺失:

bothCountersIdleReportsZeroRatherThanUnavailable 的注释称"TrafficStats 已
证明自己能看见",但该用例 trafficBytes 恒为 4096 从未增长,proven 标志实为
false,归到 TRAFFIC_STATS 只是因为 kernel 也没值而落到末尾分支。注释按实际
路径改写。

两个方法名沿用旧判据(NoCounterHasEverMoved),与改用 TrafficStats 自证后
的语义不符,改为 WhileTrafficStatsHasNotProvenItself。

新增 provenCounterGoingBlindLaterDoesNotReviveTheKernel:proven 标志置位后
计数器再转为 UNSUPPORTED 时,读数应留在 OkHttp 计数上而非复活冻结的内核
估计值。这条路径此前无覆盖,而标志"不衰减"正是防止冻结值回归的关键,需要
显式锁定。

验证:PlaybackSpeedMeter 17 条测试通过;两个 flavor 全量单测除 MpvPreload
ControllerTest 2 条外全绿,那 2 条已确认是本次合入的 origin/beta 自带缺陷。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 09:59:30 +08:00
www.xueximeng.com
9f946cfb00 docs(exo): record FFmpeg 9.0.1 completion anchor
Verification: git diff --check passed; E1 commit 0b09fc0944 and recovery tag recorded
Task-Guard: exo-e1-ffmpeg-9.0.1-record
2026-08-22 09:36:27 +08:00
www.xueximeng.com
0b09fc0944 build(exo): upgrade nextlib FFmpeg to 9.0.1
Update the Exo nextlib lock, AV3A build patch, local Maven artifacts, and documentation to FFmpeg 9.0.1 while preserving the existing soft-load and AV3A integration.

Upstream-Source: FongMi/FFmpeg@177f090e05
Nextlib-Source: anilbeesetti/nextlib@6ff6cf9d08
Assessment: docs/upstream-player-dependency-merge-assessment-2026-08-20.md
C2: dovi_rpu convert=p81 intentionally not enabled in the Exo AAR

Verification: nextlib dual-ABI FFmpeg 9.0.1 build_media_deps.sh: BUILD SUCCESSFUL in 14m 25s; AAR/POM/module hashes recorded; AV3A markers passed; app MobileArm64_v8aDebug: BUILD SUCCESSFUL in 1m 28s; git diff --check passed
Task-Guard: exo-e1-ffmpeg-9.0.1
2026-08-22 09:35:04 +08:00
Silent1566
fb83e9559c 修复:内核兜底的判据改用 TrafficStats 自证,而非任一计数器
上个提交用 everObservedBytes(任一计数器曾报出正增量)关闭内核兜底,自述
为"有意取舍"。复查后这个取舍是错的:OkTrafficCounter 是进程级计数器,海报、
TMDB、爬虫、配置请求全都计入,坏 ROM 上开播前就必然已有 Java 流量,标志一
置位内核层就永久关闭——上个提交声称保住的场景在实践中几乎必然失效,等于把
a9672e57dc 修的东西又推翻了一遍。

根因是判据选错了对象。能否看见原生 socket 只有 TrafficStats 说得上话,
OkHttp 的增量对此毫无信息量。改为 trafficStatsProvenLive:仅当 TrafficStats
自己报出过正增量,才认定它在这台设备上真的能计数,此后它的零即真相;在此
之前(UNSUPPORTED 或冻结常量)零增量视为"看不见",交给内核兜底。

于是坏 ROM + 原生 socket 下,海报流量那一秒读数归 OkHttp,海报结束后内核
重新接管,不再永久失效。测试 javaTrafficDoesNotDisableKernelFallbackFor
NativeSockets 显式锁定"接管后能退回"这一点,取代上个提交那条把缺陷当规范
锁定的 anyObservedByteEndsTheKernelFallbackForGood;另加 workingTrafficStats
RetiresTheKernelFallbackOnceItCounts 守住反向:计数器正常的设备上冻结的内核
估计值不得复活。

验证:PlaybackSpeedMeter 16 条测试通过;两个 flavor 全量单测除 MpvPreload
ControllerTest 2 条外全绿,那 2 条已确认是本次合入的 origin/beta 自带缺陷。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 08:52:33 +08:00
Silent1566
faf3e6180b 修复:评审发现的坏 ROM 兜底回归与电视版转圈网速死代码
上个提交把内核层的触发条件写成 trafficDelta < 0 && okHttpDelta <= 0,
本意是"两个计数器都看不见",但漏了一种坏 ROM:per-UID 计数器存在却恒为
常量,此时 advanceTrafficStatsBaseline 返回 0 而非 UNSUPPORTED,判定为
false,内核值被忽略,屏显归零——正是 a9672e57dc 要修的场景又回归了。

改为按"是否曾观测到字节流动"判定:任一计数器报出过正增量即置位
everObservedBytes,此后不再采信内核值;在此之前的零增量视为"看不见"
而非"没流量",交给内核兜底。这个标志是设备能力判定,不随换集重置。

代价是一个有意的取舍:坏 ROM 上若海报/爬虫等少量流量先于视频经过 Java,
读数会被那点流量接管而低估原生 socket 的视频流。低估优于冻结——冻结正是
上个提交造成的现象——故接受,并用 anyObservedByteEndsTheKernelFallback
ForGood 显式锁定该行为,测试名与注释如实说明是取舍而非最优。

顺带接上电视版点播转圈的网速:mR3 从未赋值、setTraffic() 无调用者、
showProgress() 也没启动刷新,整条链自 7a23842f8c 起就是死的,加载圈网速
一直空白,且 App.post(mR3, 1000) 若被调用会 NPE。现补 mR3 = this::setTraffic
与 showProgress/hideProgress 的调度,与其余 4 个 activity 对齐,reset 也
配上了——此前它是唯一有 setSpeed 却无 reset 的位置。

验证:PlaybackSpeedMeter 15 条测试通过(新增冻结 ROM 与取舍锁定 2 条);
两个 flavor 编译通过,全量单测除 MpvPreloadControllerTest 2 条外全绿。
那 2 条是本次合入的 origin/beta 自带缺陷,已在独立 worktree 上以纯 beta
复现确认与本改动无关。

已知未覆盖:真机 ROM 行为仍需装包实测,尤其那台 TrafficStats 失效的投影仪。
Traffic 的 WeakHashMap 无测试——它依赖 android.widget.TextView 而项目未配
Robolectric,纯 JVM 单测无法实例化。另 PlayerManager.java:1286 的"网络余量"
与 PlayerOsdController 的"稳定吞吐"仍直接展示未做时效校验的 bandwidthEstimate,
是同源的冻结问题,本次未动。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 08:39:32 +08:00
Silent1566
66981c49a2 Merge remote-tracking branch 'origin/beta' into dev3 2026-08-22 02:06:42 +08:00
Silent1566
52d9ec8c0d 修复:加载完成后屏显网速卡在固定值不变
问题:上个提交 a9672e57dc 引入三层降级取数时把优先级排反了。第一层
"播放内核自报吞吐"一旦 > 0 就直接 return,但三个内核报的都是平滑估计值,
传输停止后不衰减而是冻结在最后一次读数:Exo 的 bandwidthEstimate 是滑动
百分位(onBandwidthEstimate 不再回调即冻结)、MPV 的 raw-input-rate 只在
observer 推送时更新、IJK 的 tcp_speed 由 native 决定同样不保证归零。

于是加载完成、缓冲填满后不再下载,内核估计值卡住,又因为它 > 0 而直接
return,永远不会去看那两个真正能测出"当前 0 字节流入"的 delta 计数器,
屏显就永久停在一个固定速度上。"有时候正常"取决于是否走到内核这一层:
本地文件、内核尚未建立的加载阶段、或边播边下持续有流量时读数是对的。

方案:把降级顺序倒过来,实测 delta 优先,内核仅在它是唯一 witness 时兜底
——即 TrafficStats 失效且 Java 侧无字节,也就是"坏 ROM + 原生 socket"这个
它本来要覆盖的场景。TrafficStats 可用时它的 0 就是真相(缓冲满了确实没在
下载),读数如实归零而非保留旧值。上个提交要修的坏 ROM 场景不受影响。

顺带修掉 Traffic.meter 的 static 单例共享:原先 5 个界面共用一个 meter,
任一界面 hideProgress() 的 reset() 会把其他仍在转圈界面的基线重置到 now;
播本地文件的界面每秒 reset 会压掉播网络流界面的读数;source 字段共享还会
让一个界面判为 NONE 就把另一个的 TextView 直接 GONE。改为按 TextView 持有
(WeakHashMap,随 View 回收),Traffic.reset 因此加 view 参数,5 处调用点
已同步。

验证:PlaybackSpeedMeter 13 条测试通过,其中新增 2 条回归用例——
frozenKernelEstimateDoesNotPinReadoutWhileNetworkIsIdle 直接复现本次现象
(缓冲填满后连续采样必须归零),kernelCoversNativeSocketOnlyWhileTraffic
StatsIsBlind 确认坏 ROM 兜底未被废掉;两条锁定旧错误行为的用例已改正。
mobile 与 leanback 两个 flavor 编译通过。

已知未覆盖:真机 ROM 行为无法在单测中验证,特别是当初那台 TrafficStats
失效的投影仪,需装包确认坏 ROM 兜底仍生效。另 MpvPlayerEngine.getRuntime
Metrics 绕过了 MpvPlayer 已有的 isFreshCacheSpeedSample 新鲜度判定(对照
MpvPlayer.java:811-812 与 :1012),本次未动——内核层已不是主数据源,影响
面显著变小。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 02:06:28 +08:00
Silent1566
3c1878b6a0
Merge pull request #135 from Silent1566/dev4
合并上游 fish2018/webhtv main 最新代码
2026-08-22 01:32:35 +08:00
Silent1566
bcf5c1d531 修复:直播下 MPV 引擎误判 LUT 活跃导致多余的播放器重建
上游在 MpvPlayerEngine.buildConfig() 新增的 autoDirectEligible 判断里裸用
LutSetting.isEnabled()(全局 LUT 开关),未考虑本地的 lutAllowed 守卫。
直播场景两个 LiveActivity 都 override isLutAllowed() 返回 false,LUT 实际
被禁用,但引擎仍按「LUT 活跃」算出 autoDirectEligible=false 而放弃电视直出,
与 PlayerManager 同一判断(lutAllowed && LutSetting.isEnabled())相矛盾,
启播后 prepareMpvOutputForNewItem 会再触发一次多余的播放器重建。

改为把 lutAllowed 作为 MpvPlayerEngine 构造参数传入:buildConfig() 在构造
函数的 buildPlayer() 中就已执行,构造后再调 setter 赶不上首次配置构建。
setLutAllowed 仍保留,供运行时切换直播/点播后的下一次重建使用。

验证:leanback / mobile 两变体编译通过;单元测试 2713 / 3425 例中仅
MpvPreloadControllerTest 的 2 例失败,该失败在纯 upstream/main 上同样存在,
非本次改动引入。

注:本地 SURFACE_AUTO_STABILITY_GUARD_ENABLED 硬编码为 true,自动模式下
autoEligible 目前被短路,故此修复当前主要保证两侧判断一致,待该守卫放开后
才有可观测的行为差异。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 01:20:42 +08:00
Silent1566
30d543a0dc
Merge pull request #134 from Silent1566/dev
feat: TMDB 相关视频改为窗口化播放器
2026-08-22 00:27:39 +08:00
www.xueximeng.com
4b50754d3a fix(exo): align buffered diagnostics with disk preload
Verification: focused MobileArm64_v8aDebugUnitTest Exo/cache suite: BUILD SUCCESSFUL; git diff --check: pass
Task-Guard: exo-buffer-diagnostics-release-20260821-retry
2026-08-21 23:45:34 +08:00
Silent1566
faa4597a0e 合并远端 beta 最新代码 2026-08-21 23:16:48 +08:00
Silent1566
45a72e2d97 合并上游 fish2018/webhtv main 最新代码
同步上游 17 个提交,覆盖 MPV 自动输出/DV 能力探测、EXO 与 MPV
磁盘预载连续性、Kuaishou HLS CDN 回退、LUT 初始应用重建管线等修复。

冲突处理(10 处):
- MpvPerformanceSetting:采用上游“GPU渲染”文案,保留本地零拷贝设备保护分支。
- PlaybackActivity:保留本地 preparedPlaybackKey,并入上游 nativeOutputPending。
- PreCache:采用上游 TAG 与 eligibility 诊断,保留本地 worker 故障恢复;
  canPreCache 保留为静态方法供既有测试使用。
- PlayerManager:保留本地多线程代理封装与 effectiveEligible 设备保护,
  并入上游 mpvAutoGpuPinnedForSession、onPlayerOutputPending/Ready 与 DV 探测日志。

另修正一处自动合并引入的回归:prepareLutPipelineForCurrentItem 中上游新增的
engine.restart 绕过了本地多线程代理封装,改回 restartWithProxy。

验证:leanback / mobile 两个变体均编译通过;单元测试 2713(leanback)、
3425(mobile) 例中仅 MpvPreloadControllerTest 的 2 例失败,该失败在纯
upstream/main 上同样存在(上游将 RATIO_LOW 等由 block 改为 bootstrap 后
未同步测试断言),非本次合并引入,保持上游原状不改。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-21 22:56:28 +08:00
Silent1566
1ef3bbaf56
Merge pull request #133 from Silent1566/dev4
修复:IJK 播放器进入 READY 但永不出首帧时无法回退
2026-08-21 21:49:53 +08:00
Silent1566
6fa2e1b6b7 修复:IJK 播放器进入 READY 但永不出首帧时无法回退
电视端 IJK 硬解存在一种失败形态:播放器进入 STATE_READY,音频与
进度都在推进,但永远不渲染首帧,且不上报任何错误。现有回退链依赖
onPlayerError 触发,因此完全不生效,表现为持续黑屏。

新增会话级首帧看门狗,在已 prepared、存在视频轨、处于活跃播放但
持续无首帧/无输出帧时主动判定失败并走回退:

- 新增 IjkFirstFrameWatchdog,覆盖固定性能档位,走通用 fallbackPlayback
- IjkRuntimeProfileController 增加 handleFirstFrameTimeout /
  onPlaybackAttemptStarted,覆盖自动档位,走 profile 的内核降级
- 两条路径按 managed 与实验开关分流:自动档位仅在
  IJK_RUNTIME_KERNEL_FALLBACK 允许时由 controller 接管,否则交回
  看门狗,避免开关关闭时两边都不生效留下无保护缺口

视频轨证据取自 Tracks.containsType(TRACK_TYPE_VIDEO) 而非 evidence
的宽高:后者来源于 onVideoSizeChanged,而黑屏场景下该回调可能永不
到达,会导致看门狗永不超时。纯音频流不产生视频轨组,误报边界不变。

计时以「当次采样活跃」累加上一段间隔。若按上一次采样的状态累加,
prepared 后的第一个采样周期永远不计时,实际超时会比阈值多出一个
采样周期(PLAYBACK_TELEMETRY_INTERVAL_MS = 5s,10s 阈值实测约 15s)。
暂停时间仍不计入。

已知未做:两套计时实现目前逐行等价但仍是两份,合并会触及 profile
学习路径,留作后续单独重构。修复涉及 PlayerManager 集成层的两处
(轨道判定、实验开关分流)无单测覆盖,需先引入 seam。

验证:leanback 与 mobile 全量单测通过。真机未验证黑屏路径。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-21 21:37:27 +08:00
Silent1566
e0ee1acd81 Merge remote-tracking branch 'origin/beta' into dev4 2026-08-21 17:57:19 +08:00
Silent1566
58219b9766 Merge remote-tracking branch 'origin/beta' into dev4 2026-08-21 13:48:24 +08:00
www.xueximeng.com
04e7713daa chore: remove docs directory 2026-08-20 18:19:04 +08:00
www.xueximeng.com
75516a3d6a merge fongmi-sync into main 2026-08-20 17:50:39 +08:00
www.xueximeng.com
1873e78acb fix mpv preload network policy 2026-08-20 17:31:55 +08:00
www.xueximeng.com
bbb4a4a00a fix: restore direct preload and disk buffer progress 2026-08-20 16:59:37 +08:00
www.xueximeng.com
132800e58b fix: close failed CDN response before retry 2026-08-20 16:48:57 +08:00
www.xueximeng.com
a68ee280fa fix: recover Kuaishou HLS segments across CDN aliases 2026-08-20 15:55:31 +08:00
www.xueximeng.com
14e985586f fix: keep exo and mpv disk preload continuous 2026-08-20 11:56:34 +08:00
www.xueximeng.com
ecb8fc5743 fix: restore eager exo disk preload 2026-08-20 07:34:28 +08:00
Silent1566
c699674fc6 fix: package requests certificate dependency 2026-08-19 23:12:55 +08:00
Silent1566
803a0f94ab docs: 添加 TMDB 未匹配选集按钮实施计划 2026-08-19 22:59:17 +08:00
Silent1566
2fedb02750 docs: 设计原生增强模式未匹配 TMDB 的选集按钮回退 2026-08-19 22:39:39 +08:00
Silent1566
fc2afef20c test: cover speech ad runtime end to end 2026-08-19 21:34:17 +08:00
Silent1566
82b7d182c9 fix: link mobile speech ad resources 2026-08-19 16:15:43 +08:00
Silent1566
adc07c70ad fix: align speech ad settings across variants 2026-08-19 15:46:34 +08:00
github-actions[bot]
a0fad9b115 Merge commit 'dfdb977bd1' 2026-08-19 15:09:22 +08:00
www.xueximeng.com
d41abf83c5 fix: restore continuous exo and mpv buffering 2026-08-19 14:02:45 +08:00
github-actions[bot]
46b84b072a Merge commit 'ecb60dae0e' 2026-08-19 13:50:01 +08:00
Silent1566
607d8744d0 feat: expose speech ad settings on tv 2026-08-19 13:34:34 +08:00
Silent1566
a5973861f6 feat: expose speech ad settings on mobile 2026-08-19 13:15:43 +08:00
Silent1566
96c77a25fc feat: refresh speech ad runtime settings 2026-08-19 12:41:31 +08:00
www.xueximeng.com
f1aace426e fix: keep pause preload on cost-constrained networks 2026-08-19 12:09:40 +08:00
www.xueximeng.com
def54e68c8 fix: rebuild Exo pipeline on initial LUT apply 2026-08-19 10:48:59 +08:00
www.xueximeng.com
14e5d625fa fix: release MPV output shutter when fallback request is rejected 2026-08-19 08:28:13 +08:00
www.xueximeng.com
296cb1887b fix: hide MPV direct probe frames before GPU fallback 2026-08-19 08:02:45 +08:00
www.xueximeng.com
0d09ee4b4a fix: preserve DV metadata after direct decode failure 2026-08-19 07:16:52 +08:00
Silent1566
2feb7dc848 feat: compose speech ad provider at runtime 2026-08-19 01:17:51 +08:00
Silent1566
9355ea530e fix: preserve speech recognition across timeline resets 2026-08-19 01:09:07 +08:00
Silent1566
4cf2f76e2d feat: add speech keyword ad provider 2026-08-19 00:55:20 +08:00
Silent1566
f67ab857a7 fix: route ad skip policy through resolver 2026-08-19 00:30:26 +08:00
Silent1566
6bc5aa0257 feat: persist speech ad settings 2026-08-19 00:25:51 +08:00
Silent1566
25dc770af2 refactor: expose reusable speech recognition sessions 2026-08-19 00:12:11 +08:00
Silent1566
552e064f51 feat: support provider-specific ad skip modes 2026-08-19 00:05:09 +08:00
Silent1566
7c13de3627 feat: add speech ad keyword matching 2026-08-18 23:58:41 +08:00
github-actions[bot]
3cafbd7bcd Merge commit '7f02dc6fec' 2026-08-18 23:57:33 +08:00
Silent1566
3ec0819add docs: plan speech ad keyword provider 2026-08-18 23:07:18 +08:00
Silent1566
0b027d06f6 docs: design speech ad keyword provider 2026-08-18 22:44:45 +08:00
github-actions[bot]
27a8e22988 Merge commit '791bec7a8c' 2026-08-18 21:12:27 +08:00
Silent1566
0f066024ff merge: integrate signed ad audio probe runtime 2026-08-18 18:42:55 +08:00
Silent1566
5d3a876b6c fix: harden ad audio provider boundaries 2026-08-18 18:42:09 +08:00
www.xueximeng.com
84744257b8 fix mpv auto output and lut adaptation 2026-08-18 18:37:24 +08:00
Silent1566
6e97a8a759 feat: compose pcm and probe signal providers 2026-08-18 18:17:12 +08:00
Silent1566
011bfcd771 feat: support realtime ad skip policy switching 2026-08-18 17:58:17 +08:00
Silent1566
84e055b1ed feat: deduplicate ad audio detection candidates 2026-08-18 17:14:22 +08:00
Silent1566
f5fc2c9467 refactor: adapt pcm matcher to signal provider 2026-08-18 16:58:03 +08:00
github-actions[bot]
f8a0dd0c6e Merge commit '1623169501' 2026-08-18 16:56:40 +08:00
Silent1566
ce788ad80f feat: add extensible ad audio signal provider contract 2026-08-18 16:38:54 +08:00
github-actions[bot]
2a20d46607 Merge commit '43fbf4d02d' 2026-08-18 15:08:26 +08:00
Silent1566
4cc2295dcd feat: pair verified probe sidecars with rule snapshots 2026-08-18 14:41:26 +08:00
Silent1566
4ff21e0f3f feat: verify independent probe rule sidecars 2026-08-18 14:11:01 +08:00
Silent1566
324b3c5402 feat: define verified probe rule sidecar 2026-08-18 13:43:15 +08:00
Silent1566
276d503e7b docs: design headless ad audio probe integration 2026-08-18 13:42:51 +08:00
Silent1566
88802d1bf0 docs: close signed package security review 2026-08-18 12:39:28 +08:00
www.xueximeng.com
06962d13c3 fix: schedule MediaCodec frames before flip 2026-08-18 12:17:11 +08:00
Silent1566
008210264d docs: record signed audio package infrastructure 2026-08-18 12:14:51 +08:00
Silent1566
4f2e7f73f8 feat: add signed audio rule sources 2026-08-18 11:25:11 +08:00
Silent1566
9ef193e3d4 feat: persist verified audio rule packages 2026-08-18 10:53:40 +08:00
github-actions[bot]
e709155228 Merge commit 'ffc5619fe7' 2026-08-18 01:48:54 +08:00
Silent1566
183344f83d feat: verify trusted audio rule packages 2026-08-18 00:21:24 +08:00
Silent1566
d6a62caef9 feat: add strict signed rule envelope codec 2026-08-18 00:04:51 +08:00
Silent1566
3905d37b70 build: add Tink Ed25519 verification 2026-08-17 23:37:49 +08:00
Silent1566
75ebcda324 refactor: decouple ad audio rule sources 2026-08-17 23:17:09 +08:00
Silent1566
b1a65c01a2 docs: plan signed audio rule package implementation 2026-08-17 23:04:57 +08:00
Silent1566
71b4ac9d62 docs: design signed audio rule packages 2026-08-17 22:23:13 +08:00
Silent1566
5f5ccc5d40 docs: evaluate audio fingerprint sdk integration 2026-08-17 21:54:04 +08:00
github-actions[bot]
6a59795096 Merge commit '1e090518c8' 2026-08-17 18:00:54 +08:00
github-actions[bot]
52dbbbac37 Merge commit 'dba7d1fc2c' 2026-08-17 15:26:12 +08:00
github-actions[bot]
f058d53a9b Merge commit '731baa2483' 2026-08-17 00:44:53 +08:00
github-actions[bot]
34676061a7 Merge commit '4f0a1e7b87' 2026-08-16 22:42:40 +08:00
github-actions[bot]
94dfb70040 Merge commit 'c6dfc3f537' 2026-08-16 21:47:29 +08:00
github-actions[bot]
b06cd1c5e4 Merge commit '499b429d25' 2026-08-16 18:43:25 +08:00
github-actions[bot]
d07a99c5e9 Merge commit '8cdb5e1ad9' 2026-08-16 00:44:24 +08:00
github-actions[bot]
fe37708e1a Merge commit 'adcbc66e85' 2026-08-15 23:39:03 +08:00
Silent1566
195ca41822
Merge pull request #113 from Silent1566/beta
Beta
2026-08-14 23:32:08 +08:00
www.xueximeng.com
58c984c1c7 fix: refresh bundled MPV libraries after app updates 2026-08-13 17:05:28 +08:00
1774 changed files with 230507 additions and 9360 deletions

10
.gitignore vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show more