channel_info(url) UniFFI suspend fn. ChannelViewModel + SubscriptionFeedViewModel both swap. NewPipeExtractor (Java) is OUT — zero org.schabi.newpipe classes in the APK now. Cleanup: - NewPipeDownloader.kt deleted (was the OkHttp adapter) - Thumbnails.kt deleted (rustypipe returns full URLs) - NewPipe.init() dropped from StrawApp.onCreate - libs.newpipe.extractor removed from build.gradle.kts - STRAW_USER_AGENT + strawHttpClient() now live in net/Http.kt - RydClient + SponsorBlockClient + PlayerScreen + PlaybackService all read from net/Http.kt instead of the extractor package rustypipe API quirks beat: - channel_videos(id) is the right method (channel() doesn't exist) - ChannelInfo struct = basic metadata; Channel<T> wrapper carries name/avatar/banner + .content is the paginator of videos - description is String (not Option), subscriber_count is Option<u64> End state: strawApp Kotlin is ~UI + thin glue to strawcore. The Rust core handles search / streamInfo / channel / channel_videos via UniFFI suspend fns. Tokio + reqwest + rustls + rquickjs all packed in libstrawcore.so (~6MB per ABI). APK 40MB total.
50 lines
1.5 KiB
Rust
50 lines
1.5 KiB
Rust
// strawcore — Rust core for the Straw Android app.
|
|
//
|
|
// Phase U-1: hello-world smoke test. One exported function, returns a
|
|
// String so we know JNI + UniFFI marshalling works end-to-end before we
|
|
// pull in rustypipe.
|
|
//
|
|
// Phase U-2+ adds real APIs (search, stream_info, channel_info).
|
|
|
|
use std::sync::Once;
|
|
|
|
mod channel;
|
|
mod error;
|
|
mod runtime;
|
|
mod search;
|
|
mod stream;
|
|
|
|
#[allow(unused_imports)]
|
|
use runtime::block_on;
|
|
|
|
// Re-exports so UniFFI sees the types at the crate root for macro discovery.
|
|
pub use channel::ChannelInfo;
|
|
pub use error::StrawcoreError;
|
|
pub use search::SearchItem;
|
|
pub use stream::{AudioStreamItem, StreamInfo, VideoStreamItem};
|
|
|
|
/// Initialize Android logging once. The Kotlin side calls this from
|
|
/// StrawApp.onCreate() so anything emitted via `log::info!()` shows up in
|
|
/// `adb logcat -s strawcore`.
|
|
#[uniffi::export]
|
|
pub fn init_logging() {
|
|
static ONCE: Once = Once::new();
|
|
ONCE.call_once(|| {
|
|
android_logger::init_once(
|
|
android_logger::Config::default()
|
|
.with_max_level(log::LevelFilter::Info)
|
|
.with_tag("strawcore"),
|
|
);
|
|
log::info!("strawcore initialized");
|
|
});
|
|
}
|
|
|
|
/// Smoke-test entry point — round-trip a string through JNI so we know
|
|
/// the bridge is working before pulling in rustypipe.
|
|
#[uniffi::export]
|
|
pub fn hello_from_rust(name: String) -> String {
|
|
log::info!("hello_from_rust called with name={}", name);
|
|
format!("hello {} from rust 🦀 (strawcore v{})", name, env!("CARGO_PKG_VERSION"))
|
|
}
|
|
|
|
uniffi::setup_scaffolding!();
|