npe-sync: visitorData + visionOS(101) + xtags audio typing (best-effort, additive)
Some checks failed
gitleaks / scan (push) Failing after 1s

Brings the port up to current NewPipe Extractor coverage:
- visitorData: fetched + attached to the anonymous reel/web/ios/visionos
  InnerTube contexts (upstream "always pass a valid visitorData"). Best-effort
  — a failure returns None and extraction proceeds exactly as before. Cached
  process-wide with a 15-min TTL, and invalidated when the primary android
  response is rejected (decoy/playability) so a bad session self-heals.
- visionOS client (101): a 4th /player fetch, ON by default, recovering >360p
  streams for SABR-only / made-for-kids videos where android/ios cap at 360p.
  Formats merged android-first (android wins itag ties); a failure changes
  nothing. HLS + DASH manifest branches now skip empty urls (an empty visionOS
  url no longer shadows a real ios/android one).
- xtags: derive audio track type (original/dubbed/descriptive/secondary) from
  the format xtags protobuf, falling back to the audioIsDefault heuristic when
  absent. Hand-rolled protobuf walker, fuzzed (4M inputs, no panic); 32-bit
  length guarded via try_from.

FFI surface unchanged (AudioStream gains an additive track_type the wrapper
may later surface). 155 lib + 7 integration tests, clippy -D clean.
This commit is contained in:
Cobb 2026-07-29 07:07:42 -07:00
parent 988e67414d
commit 2452f1785d
10 changed files with 821 additions and 70 deletions

View file

@ -36,6 +36,18 @@ pub const ANDROID_CLIENT_VERSION: &str = "21.03.36";
pub const ANDROID_SDK_VERSION: u32 = 36;
pub const ANDROID_OS_VERSION: &str = "16";
// visionOS client (client 101). A best-effort 4th /player fetch that recovers
// >360p streams for SABR-only / "made for kids" videos where the ANDROID/IOS
// clients cap at a single 360p muxed stream. Values from NPE
// ClientsConstants.java (commit 82b7e410, "Workaround again SABR-only
// responses"). Carries NO poToken.
pub const VISIONOS_CLIENT_ID: &str = "101";
pub const VISIONOS_CLIENT_NAME: &str = "VISIONOS";
pub const VISIONOS_CLIENT_VERSION: &str = "1.02";
pub const VISIONOS_DEVICE_MODEL: &str = "RealityDevice14,1";
pub const VISIONOS_OS_VERSION: &str = "25.6.0.23O471";
pub const VISIONOS_USER_AGENT_VERSION: &str = "25_6_0";
// Base URLs (NPE YoutubeParsingHelper.java:91,96).
pub const YOUTUBEI_V1_URL: &str = "https://www.youtube.com/youtubei/v1/";
pub const YOUTUBEI_V1_GAPIS_URL: &str = "https://youtubei.googleapis.com/youtubei/v1/";