0
Fork 0
mirror of https://github.com/XiaochangXu/AVBox.git synced 2026-10-24 07:09:08 +00:00
Commit graph

519 commits

Author SHA1 Message Date
XiaochangXu
b8d70d2c08 chore(release): bump version to 1.2.9 v1.2.9 2026-10-23 12:22:03 +08:00
XiaochangXu
fd95a99c1f feat(player): drive decode choice from instance codec flow 2026-10-23 12:22:02 +08:00
XiaochangXu
b07ae2e723 style(ui): tune top bar system info rows and source sheet height 2026-10-23 12:21:57 +08:00
XiaochangXu
203a3492ab fix(player): skip system bottom gesture band when starting gestures 2026-10-23 12:21:57 +08:00
XiaochangXu
4e951532b1 perf(iso): prefetch mpls extents in windows and bound span cache 2026-10-23 12:21:57 +08:00
XiaochangXu
0ca092a654 feat(ui): responsive list columns and compact follow schedule
- size search, records and following lists from the available width instead of a fixed three columns, so narrow tablets and landscape phones drop to two
- merge the follow schedule into a single line when a weekday filter is active, showing today or the picked weekday plus the update hour
- drop the nav scrim on rail layouts and reduce it to the phone-only bottom band
- move records and following onto lazy grids so item animations stay per card and delete keeps a single row moving
2026-10-23 08:42:42 +08:00
XiaochangXu
19a67cbc9c fix(source): route folder list to its own site and reuse one activity
- pass the card source key into the folder page, so a netdisk folder no longer loads the home source latest list
- switch the folder page to singleTop with an internal level stack, so drilling in no longer creates one activity per level
- rebuild the list loader on every level change to drop late responses from the abandoned level
- restore the entry mode and static title when returning to the root level
- reset the grid scroll position when the level changes
- add PartitionNavStack with unit tests for push, pop and root detection
2026-10-23 07:52:16 +08:00
XiaochangXu
5c0ed6432a fix(iso): stabilize playback, fix playlist selection, speed up cold start 2026-10-23 07:10:07 +08:00
XiaochangXu
13a26dcbf0 feat: import local sources from file manager, cancel stale source loads
- open .py/.js sources via ACTION_VIEW and save them to the vod list without switching
- name picked sources after the file instead of the clan path
- cancel in-flight config and jar fetches so switching never waits on the abandoned source
- keep load epoch guards on jar retries and on config write-back
- show http status in the terminal playback tip and allow slow opens a grace window
2026-10-23 02:14:36 +08:00
XiaochangXu
022f4652c2 fix(detail): stop auto source switch on empty detail and retry once
- keep the current source when the detail returns no playable episode or an empty payload, only fall back after playback failure, stale subscription entries or a manual switch
- retry the same vod id once before declaring no-line or empty, so a truncated mirror response is not read as a dead source
- limit auto fallback candidates to changeable sites and keep non-changeable ones in the switch-source chips
- log detail body length and head to tell transport truncation from a parse miss
2026-10-22 12:35:31 +08:00
XiaochangXu
aaef7c701c perf(detail): preheat webview after first frame 2026-10-22 11:37:00 +08:00
XiaochangXu
3ee7832c38 feat(player): osd orientation aware safe insets and pss label 2026-10-22 09:24:11 +08:00
XiaochangXu
88775325e8 feat(player): osd memory and java heap rows with aligned label layout 2026-10-22 08:48:05 +08:00
XiaochangXu
839f25398d feat(player): bidirectional decode fallback plus continuous sheet corners
auto retry falls back soft->hard as well as hard->soft with one switch per ladder and skips when the hardware target is already in use; params sheet refreshes after kernel release so the decode row matches the new tier; continuous corner shapes for player sheets, bottom sheets and menus; new hard decode fallback tip in three locales
2026-10-22 06:04:30 +08:00
XiaochangXu
6e850b57cc feat(player): iso nested bdmv and parallel mpls fetch plus search, glass and nav rail fixes
- iso: nested BDMV lookup, 4-thread mpls fetch with serial fallback, probe via Content-Range with stub guard, deferred volume snapshot, read/stream diagnostics with bounded log volume

- ui: douban hot search referer plus parse-guarded cache with self-heal, liquid glass defaults blur 5 / distortion 30 / translucency 50%, theme preview capsule mockup with continuous corners and dot-only nav row, fixed-height vertical nav rail with stride derived from slot count
2026-10-22 03:42:55 +08:00
XiaochangXu
5b941a4b14 feat(player): magnet detail prerender and on-play resolve plus p2p and jianpian removal 2026-10-22 00:00:00 +08:00
XiaochangXu
c701f0647a feat(ui): quality switch in player sheet, press morph opt-in and config focus dismiss
- move quality chips from detail page into player episode sheet
- gate capsule press morph behind pressMorph flag on records, home poster and player params
- clear focus on blank tap, drag and ime dismiss in config manage page
- animate search rail site filter and align search field font weight
- boot guard, kv key spec and logging tweaks
2026-10-21 09:38:34 +08:00
XiaochangXu
4ead3cbacd feat(ui): search rail source filter, focus dismiss, suggest tuning and press morph 2026-10-21 05:18:21 +08:00
XiaochangXu
e32a1e3934 fix(player): blu-ray iso audio, subtitle languages, cache path and 10-bit tips 2026-10-21 05:18:21 +08:00
XiaochangXu
dc98aa6f44 feat: background config refresh plus episode, tmdb, theme and nomedia tweaks 2026-10-21 05:18:21 +08:00
XiaochangXu
e40e68dac5 docs: iso playback spec, defect chronicle and readme wording 2026-10-21 05:18:21 +08:00
XiaochangXu
dd9a58364f feat(player): blu-ray iso playback hardening (mpls playlists, rap start, tracks) 2026-10-21 05:18:21 +08:00
XiaochangXu
b029d81aee feat(player): pgs subtitles via media3 subtitle transcoding 2026-10-21 05:18:21 +08:00
XiaochangXu
b8c194b053 feat(player): blu-ray iso playback over media3 (udf, m2ts, lpcm, truehd ac3 core) 2026-10-21 05:18:21 +08:00
dependabot[bot]
4afe60e4c8
deps(deps): bump com.chaquo.python (#45)
Bumps the chaquopy group with 1 update: [com.chaquo.python](https://github.com/chaquo/chaquopy).


Updates `com.chaquo.python` from 17.0.0 to 17.1.0
- [Release notes](https://github.com/chaquo/chaquopy/releases)
- [Commits](https://github.com/chaquo/chaquopy/compare/17.0.0...17.1.0)

---
updated-dependencies:
- dependency-name: com.chaquo.python
  dependency-version: 17.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: chaquopy
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-19 09:14:47 +08:00
XiaochangXu
aa53612b59 feat(source): import single-file local js spider as config 2026-10-19 02:31:05 +08:00
XiaochangXu
3e11891c97 fix(player): skip soft decode fallback when the target codec is already in use
- skip hard->soft retry when the software candidate equals the current codec
- only applies when the current decoder is already software, so hardware paths stay unchanged
- compare codec names first and fall back to the actual decode kind when unavailable
- add unit tests for the skip decision edges
2026-10-19 00:39:43 +08:00
XiaochangXu
ed1084b727 feat: report in-use video decode; js net session, cookies and stream proxy
- player: params sheet decode selection follows the actual codec in use
- player: keep codec stats across kernel reuse, clear only on kernel release
- player: sync global decode default on line switch with per-title lock intact
- js: add net.session and cookie jar, http gate, html query, open stream and proxy stream
- net: add proxy header policy; tests for decode display and js net pieces
2026-10-19 00:29:12 +08:00
XiaochangXu
7b7173945e release 1.2.8: enable auto switch line by default v1.2.8 2026-10-18 05:39:56 +08:00
XiaochangXu
c24d6150e6 feat: spider storage notice and tablet home layout default
- toast once per launch when a spider module opens the all files access page, suppressed for host pickers and permission requests
- log echo-storage for the notice and whitelist the prefix in the file logger
- home poster defaults to the plain layout on screens from 600dp, phones keep immersive
- extract resolveHomeLayoutVertical and cover the default and stored-choice rules with unit tests
2026-10-18 04:01:05 +08:00
XiaochangXu
83e598d3fc feat(ui): full-bleed tablet landscape detail hero and icon polish 2026-10-18 03:29:17 +08:00
XiaochangXu
471214e536 ci(notify): drop the caption on the apk attachment 2026-10-17 08:32:52 +08:00
XiaochangXu
c8bbfe9e78 release 1.2.7: compress native libs, attach changelog and APK to the telegram notification v1.2.7
- gradle: enable jniLibs.useLegacyPackaging, release apk 43.3 -> 27 MiB, version 1.2.6/30 -> 1.2.7/31
- changelog: add the v1.2.7 section
- notify: set GH_REPO for the release fetch step, gh cannot resolve the repo without a checkout so
  the notification used to degrade to a text-only message silently; print the gh error instead of
  swallowing it
- release: pass GH_TOKEN to the notify workflow
2026-10-17 08:20:46 +08:00
XiaochangXu
f9202d3de8 feat: tmdb episode mapping, season guard, vod_en fallback and decode-capability notice
- tmdb: map episodes by site episode numbers (no season hint, single regular season, unique numbers within season count) with a cache-key fingerprint, fallback to ordered mapping; episode thumbnails badge the site number
- tmdb: tvOnly guard keeps titles carrying a season hint on tv results across pickBest, bestHit, alias cache and lookup paths
- tmdb: alt-name fallback via apple cms vod_en, threaded through beans, nameCandidates, resolve and cache entries, hero, detail sections, episode row and list cards
- player: surface decode-capability-exceeded errors as a dedicated terminal message and cancel the play timeout on retry and error paths
- osd: rebuild the audio codec probe with live/predicted source tracking and extend the decoder guess chain
- detail: hero description collapses to three lines by default
- tests: episode mapping, tv guard, alt-name resolution and serialization regressions; sync the mobile ui spec
2026-10-16 08:56:51 +08:00
XiaochangXu
674c12eb84 release 1.2.6: detail page poster backdrop blur and scrim tuning v1.2.6 2026-10-15 07:58:29 +08:00
XiaochangXu
ae65d92b68 ui: player action row, detail sheet and hero polish
- player: keep fullscreen action icons in the bottom bar on all portrait screens
- player: scale bottom-bar action icons with the mm system to match the transport row
- detail: align follow/tmdb sheet backgrounds with the app theme
- detail: drop the line chips row from the portrait episode sheet
- detail: bump hero circle buttons to 50dp and add cast/genre section icons
2026-10-15 07:12:05 +08:00
XiaochangXu
7908b33d15 feat(player): vsync danmu clock and layer migration, height-aware slide animations, drop picture restart hint
- danmu: PlayerDanmakuView subclass enables non-block mode and disables idle sleep; vsync extrapolated danmu clock with rebase, retune and drift tracking in MyVideoView
- danmu: move the danmaku layer into the player container, tune the load controller and default alpha
- controls: PlayerSlideVisibility slides by measured content height, replacing the fixed-offset AnimatedVisibility wiring in top bar and overlay
- picture: remove the obsolete restart-required hint and the RestartRequired reason, sync three locales, tests, spec and history
2026-10-15 06:03:23 +08:00
XiaochangXu
47a1472795 feat: tmdb hero logo art, cast and genres sections, hero image-content split with parallax
- tmdb: fetch and cache logo artwork with language and vote rank, fallback to text title after timeout
- hero: split fixed image area from content column, add rating line and collapsible overview
- hero: scroll parallax scale and fade, pull-down stretch, status bar icon switch when hero scrolls out
- detail: add cast and genres sections after sources, drop related section, add detail_genres strings
- tests: scroll progress, rating note and tmdb logo parsing; sync mobile ui spec
2026-10-15 01:28:30 +08:00
XiaochangXu
0a39eb11c1 fix(history): refresh card time at session end, update-only touch and release flush
refresh vodRecord.updateTime on pause/stop/completion via HistoryWriter.touch, gated by the WatchProgressStore.save result and the new canRecord; a missing row stays a no-op so deleted entries never revive

touch writes updateTime only and never the session preview's dataJson, keeping reverseSort/note/year of stored rows

flush progress and history time before engine release/releasePlayer/enterLive; sampler.flushNow carries a main-thread guard

jianpian: guard-early-return cleanup
2026-10-14 22:29:19 +08:00
XiaochangXu
024d0329da refactor(perf): move room db and boot disk io off the main thread, strictmode log gate and player top bar
- data: suspend-only dao and repository contracts, allowmainthreadqueries removed (r1/r2/r4)
- boot: dns-over-https client, thunder cache cleanup and quickjs native load moved off the main thread (oncreate main thread ~55ms -> ~44ms)
- probe: debug-gated step/trace/measure instrumentation for boot and frame kv cost
- player: portrait top bar actions relocated above the seek bar and evenly spread, title no longer clipped
- strictmode: detectnetwork and vmpolicy added, penaltydeath rolled back to penaltylog
- epg: parse on the okhttp callback thread, background asset load with empty-map fallback
- tests: data layer suspend contract, watch progress queue order, epg parser
2026-10-14 14:05:25 +08:00
XiaochangXu
be689dc793 refactor(data): unify records pages on reactive state surfaces, history card polish and log cleanup 2026-10-14 07:20:31 +08:00
XiaochangXu
f305cd1a2d refactor: clear all non-null assertions in main and Chaquopy sources
- 974 `!!` removed across app/src/main/java, app/src/python/java and the quickjs wrapper (126 files, +1489/-1186)

- replacements: null guards, hoisted locals, requireNotNull; the few ?. cases are display/log-only and registered in the batch record

- no signature, visibility, field-type or nullability changes; NPE -> IllegalArgumentException at the same call sites, all inside pre-existing catch blocks

- rule + gate registered: SKILL.md null-safety line and the gate step, avbox-code-review-spec.md gains the null-safety section

- also carries the pending PyLog release log-strip keep rules (proguard-rules.pro + companion marker)

Verified: :app:assembleDebug green; :app:testDebugUnitTest 953 passed / 0 failed / 1 skipped; null_assert_gate.py PASS (only the 2 vendored L5 exemptions remain)
2026-10-14 05:41:59 +08:00
XiaochangXu
b96c5c9ae2 feat: tmdb quality-tag matching, segment folding and resolution-aware hero images, bad-source detection, release v1.2.5 v1.2.5 2026-10-13 00:48:05 +08:00
dependabot[bot]
ed19358d5b
deps(deps): bump gradle-wrapper from 9.8.0 to 9.8.1 (#44)
Bumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.8.0 to 9.8.1.
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](https://github.com/gradle/gradle/compare/v9.8.0...v9.8.1)

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.8.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-12 11:43:34 +08:00
dependabot[bot]
a9997462cf
deps(deps): bump the kotlin group with 2 updates (#43)
Bumps the kotlin group with 2 updates: [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) and [org.jetbrains.kotlin.plugin.compose](https://github.com/JetBrains/kotlin).


Updates `org.jetbrains.kotlin.android` from 2.4.20 to 2.4.21
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.4.20...v2.4.21)

Updates `org.jetbrains.kotlin.plugin.compose` from 2.4.20 to 2.4.21
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.4.20...v2.4.21)

Updates `org.jetbrains.kotlin.plugin.compose` from 2.4.20 to 2.4.21
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.4.20...v2.4.21)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-version: 2.4.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: kotlin
- dependency-name: org.jetbrains.kotlin.plugin.compose
  dependency-version: 2.4.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: kotlin
- dependency-name: org.jetbrains.kotlin.plugin.compose
  dependency-version: 2.4.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: kotlin
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-12 11:39:13 +08:00
XiaochangXu
b0c4eecf42 fix(player): auto retry ladder, zero-start gate and line-switch resume, release v1.2.4 v1.2.4 2026-10-11 12:04:19 +08:00
XiaochangXu
e3af093c52 feat(player): progress single writer and ui gate, release v1.2.3 v1.2.3 2026-10-11 01:39:28 +08:00
XiaochangXu
6fbc81d71c refactor(quickjs): migrate the local wrapper layer from Java to Kotlin
- migrate the 4 Java files under quickjs/src/main/.../wrapper to Kotlin
  (ContextSetter, Function, JSUtils, UriUtil); the module now has 0 Java
- clarify that quickjs/ is not vendored code: the real third-party part is the
  wang.harlon.quickjs maven dependency (wrapper-java 3.2.3, 21 classes), which
  cannot be migrated because the native side matches it by name; only the 4
  locally written files were converted
- keep the bytecode contract identical: UriUtil keeps its 4 public statics and
  JSUtils keeps isEmpty/isNotEmpty/toJsonObject/toJsonArray plus the instance
  methods, all with unchanged descriptors; the only rename is
  toArray(byte[]) -> toByteArray (no call site uses it)
- keep @Retention(RUNTIME) on both annotations explicit, and restore the AOSP
  and caoccao Apache-2.0 headers the port had dropped
- add UriUtilTest (13 cases) written against the Java version first, so the
  Kotlin port is proven equivalent by tests rather than by inspection;
  resolveToUri stays untested because Uri.parse returns null under Robolectric
- quickjs: add the kotlin.android plugin and set jvmTarget to 21
- full :app:testDebugUnitTest is 904 cases / 0 failures / 1 skipped
- record the rules and pitfalls in the Kotlin migration spec (section 7.24)
2026-10-10 11:12:40 +08:00
XiaochangXu
997de06739 refactor(test): migrate the remaining Java tests to Kotlin
- migrate 11 test files / 1241 lines from Java to Kotlin, pure language change
  with no logic edits: ConfigParser, Depot, VodInfoReverse, EpisodeMatcher,
  FileUtilsNativeLibRepair, SearchHelper, PlaybackAttemptState,
  SubtitleFilePicker, BootGuard, KVKeySpec, KVDecoder
- keep the test count of every class identical (139 cases in total); full
  :app:testDebugUnitTest stays at 891 cases / 0 failures / 1 skipped
- app/src now has 0 Java; the only remaining Java lives in the vendored
  quickjs wrapper module
- fix the stale "app/src/test is out of migration scope" row and record the
  test-side conversion rules in the Kotlin migration spec
2026-10-10 10:50:36 +08:00
XiaochangXu
4ace45e3f3 feat(player): drop 500ms click throttle, add press/enter-exit animations and audio decode info
- player: remove the per-key 500ms click throttle entirely, delete the dead
  FastClickCheckUtil; play/pause now drives the kernel without any guard
- player: add zero-ripple press elasticity for all overlay icons (transport,
  top bar, side rotate/lock) and a spring-driven seek thumb
- player: add enter/exit animations for bars, hints, side buttons and info OSD,
  unified at 120ms; exit really leaves the composition tree
- player: fix the top bar stuck below the top edge by keeping the scrim out of
  the content flow (Box instead of Column)
- player(osd): show audio decode kind and the real decoder name, read from
  MediaCodecRenderer.getCodecInfo() with a MediaCodecList fallback
- player: unify the hard/soft decode rule into PlayerHelper.decodeKindOf
- records: reduce the gap between the segmented control and the first card
  to 12dp (history + collect)
- chore: bump version to 1.2.3-alpha03 (versionCode 26) and add changelog entry
- docs: update the UI spec and the history archive
2026-10-10 10:40:28 +08:00