122 lines
4.1 KiB
Markdown
122 lines
4.1 KiB
Markdown
# Straw
|
|
|
|
A privacy-focused Android YouTube client. Compose UI, Media3 player, with
|
|
[SponsorBlock](https://sponsor.ajay.app/) auto-skip and
|
|
[Return YouTube Dislike](https://returnyoutubedislike.com/) baked in. No login,
|
|
no Google Play Services, no tracking — Straw talks to public web endpoints only.
|
|
|
|
Straw is a fork of [NewPipe](https://github.com/TeamNewPipe/NewPipe). The
|
|
extractor is **strawcore**, a Rust port of NewPipe's extraction logic exposed
|
|
to Kotlin via [UniFFI](https://mozilla.github.io/uniffi-rs/) — there's no
|
|
InnerTube/JS-deobfuscation code path on the JVM anymore.
|
|
|
|
## Features
|
|
|
|
- Search, video detail, channel pages, playlists
|
|
- Inline player + fullscreen + swipe-down minibar + background audio + PiP
|
|
- Media3 ExoPlayer (DASH / HLS / progressive / merged DASH chunks)
|
|
- SponsorBlock auto-skip, with per-category toggles
|
|
- Return YouTube Dislike on the video detail page
|
|
- RSS-based subscription feed (fast — about a second for 50 subscriptions)
|
|
- Hide-shorts / hide-paid / hide-age-restricted feed filters
|
|
- Resume positions, watch history, search history
|
|
- Local playlists; downloads (video + audio)
|
|
- Imports NewPipe-format settings (subscriptions + playlists + history)
|
|
|
|
### Out of scope (on purpose)
|
|
|
|
- Trending / algorithmic feeds — subscriptions only
|
|
- iOS / desktop targets — Android only for now
|
|
- Anything that needs Google Play Services or an account
|
|
|
|
## Install
|
|
|
|
Pre-built APKs are published to an F-Droid repository:
|
|
|
|
```
|
|
https://fdroid.sulkta.com/fdroid/repo
|
|
```
|
|
|
|
Add that repo to the F-Droid client of your choice and install **Straw**. The
|
|
app also self-updates from the same repo when a newer `versionCode` is
|
|
published.
|
|
|
|
If you'd rather build it yourself, see **Build** below.
|
|
|
|
## Build
|
|
|
|
Straw is a standard Gradle project with a Rust component (`strawcore`) compiled
|
|
for Android via `cargo-ndk` and bound to Kotlin with `uniffi-bindgen`. The
|
|
Gradle build drives both automatically.
|
|
|
|
### Prerequisites
|
|
|
|
- JDK 21
|
|
- Android SDK with platform `android-36`, build-tools `36.0.0`, and NDK `r27`
|
|
(`ANDROID_NDK_HOME` must point at it)
|
|
- A Rust stable toolchain with the four Android targets, plus `cargo-ndk` and
|
|
`uniffi-bindgen`:
|
|
|
|
```sh
|
|
rustup target add aarch64-linux-android armv7-linux-androideabi \
|
|
x86_64-linux-android i686-linux-android
|
|
cargo install cargo-ndk uniffi-bindgen
|
|
```
|
|
|
|
### Assemble a debug APK
|
|
|
|
```sh
|
|
./gradlew :strawApp:assembleDebug
|
|
```
|
|
|
|
The APK lands in `strawApp/build/outputs/apk/debug/`.
|
|
|
|
### Reproducible build image
|
|
|
|
`ci/Dockerfile` defines a self-contained image with the exact JDK + Android SDK
|
|
+ NDK + Rust toolchain the build expects, if you'd rather not install all of
|
|
that on your host:
|
|
|
|
```sh
|
|
docker build -t straw-build ci/
|
|
docker run --rm -v "$PWD":/src -w /src straw-build ./gradlew :strawApp:assembleDebug
|
|
```
|
|
|
|
## Project layout
|
|
|
|
```
|
|
strawApp/ The app — Compose UI, Media3 wiring, SponsorBlock + RYD clients
|
|
rust/ strawcore — the UniFFI wrapper crate around the Rust extractor
|
|
buildSrc/ Shared Gradle build logic and version constants
|
|
iosApp/ Empty iOS shell inherited from upstream (not built)
|
|
```
|
|
|
|
The actual extraction engine (`strawcore-core`) lives in a sibling repository,
|
|
[`strawcore`](https://git.sulkta.com/Sulkta-OSS/strawcore), and is pulled in as
|
|
a path/Git dependency by `rust/strawcore`.
|
|
|
|
## Contributing
|
|
|
|
Issues and pull requests are welcome. A few notes:
|
|
|
|
- Keep changes scoped and described; the build runs lint/format checks.
|
|
- The app is Kotlin + Jetpack Compose; the extractor is Rust. Touch the layer
|
|
the change belongs in.
|
|
- By contributing you agree your work is licensed under GPL-3.0-or-later (see
|
|
**License**).
|
|
|
|
## License
|
|
|
|
GPL-3.0-or-later, inherited from upstream NewPipe. See [`LICENSE`](LICENSE).
|
|
|
|
## Upstream
|
|
|
|
Straw tracks [NewPipe](https://github.com/TeamNewPipe/NewPipe); upstream
|
|
improvements are pulled in periodically. The `app/` and `shared/` modules from
|
|
NewPipe were removed once Straw became its own app on the strawcore pipeline.
|
|
|
|
## Disclaimer
|
|
|
|
Not affiliated with YouTube, Google, NewPipe e.V., the SponsorBlock project, or
|
|
Return YouTube Dislike. All trademarks belong to their respective owners. Straw
|
|
uses public web endpoints and does not authenticate to any account.
|