C-1: rust/strawcore/Cargo.toml now points at Sulkta-Coop/rustypipe
v0.11.5-sulkta.2 (kayos/m1-sig-port) instead of upstream 0.11.4.
Upstream's sig-regex hard-fails on current YT player c2f7551f;
the fork soft-fails, defaults to iOS-first, makes Deobfuscation
errors switchable through the client-fallback chain, and adds
observability via Reporter Level::WRN.
C-2: strawApp/build.gradle.kts restores the U-1 era Gradle Rust glue:
- cargoBuild → cross-compile strawcore for 4 Android ABIs
- cargoBuildHost → host-arch debug build for uniffi-bindgen
to read metadata from
- uniffiBindgen → generate Kotlin bindings from libstrawcore.so
Wired into the Android build via mergeXxxJniLibFolders +
compileXxxKotlin task dependencies.
Bumps + gitignores:
- .gitignore now excludes rust/target, strawApp/src/main/jniLibs,
and strawApp/src/main/java/uniffi (generated)
- jna 5.14.0 added as the JNI bridge runtime
Next: cargoBuildHost + uniffiBindgen verification in crafting-table,
then C-3 swaps SearchViewModel back to uniffi.strawcore.search().
stream_info(url) UniFFI suspend fn replaces NewPipeExtractor's
StreamInfo.getInfo() for both VideoDetailViewModel and PlayerViewModel.
One Rust round-trip drives the detail screen render AND the player's
resolve(). The VideoDetailUiState.info field cached on detail load is
reused by the Download dialog so we don't refetch.
Deferred to U-3.5:
- like_count (rustypipe's player() doesn't surface engagement data;
a separate query is needed)
- related (player() doesn't include 'up next'; comes from a separate
endpoint). Kotlin gets empty list for now — RelatedRow handles it.
Type quirks vs my initial guesses (caught by cargo check):
- details.duration is u32, not Option<u32>
- channel is split into channel_id + channel_name, not a struct
- like_count doesn't exist at this query depth
- VideoFormat::Webm (lowercase mb), VideoCodec::Avc1 (not H264)
- video_only is a separate vec (video_only_streams), not a bool flag