docs: public README + reproducible build image
This commit is contained in:
parent
120caa9050
commit
a033402a44
2 changed files with 153 additions and 49 deletions
143
README.md
143
README.md
|
|
@ -1,77 +1,122 @@
|
|||
# Straw
|
||||
|
||||
A Sulkta fork of [NewPipe](https://github.com/TeamNewPipe/NewPipe). Android YouTube
|
||||
client, Compose UI, Media3 player, with [SponsorBlock](https://sponsor.ajay.app/)
|
||||
and [Return YouTube Dislike](https://returnyoutubedislike.com/) baked in.
|
||||
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.
|
||||
|
||||
The extractor is `strawcore`, a Rust port of NewPipeExtractor exposed to Kotlin
|
||||
via UniFFI. No InnerTube/JS deobf code path lives on the JVM anymore.
|
||||
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
|
||||
|
||||
F-Droid repo: <https://fdroid.sulkta.com/fdroid/repo>
|
||||
|
||||
Add the repo in your F-Droid client of choice, then install Straw.
|
||||
|
||||
The app also self-updates from the same repo when an APK lands there with a
|
||||
higher `versionCode`.
|
||||
|
||||
## What's in
|
||||
|
||||
- Search, video detail, channel pages, playlists
|
||||
- Inline player + fullscreen + minibar + background audio + PiP
|
||||
- Media3 ExoPlayer (DASH / HLS / progressive / merged DASH chunks)
|
||||
- SponsorBlock auto-skip (categories user-toggleable)
|
||||
- Return YouTube Dislike on video detail
|
||||
- RSS-based subscription feed (fast — ~1s for 50 subs)
|
||||
- Hide-shorts / hide-paid / hide-age-restricted feed filters
|
||||
- Resume positions + watch history + search history
|
||||
- Local playlists, downloads (video + audio)
|
||||
- NewPipe-format settings import (subs + playlists + history)
|
||||
|
||||
## What's out (on purpose)
|
||||
|
||||
- Trending / algorithmic feeds. Subscriptions only.
|
||||
- iOS / desktop targets. Android-only for now.
|
||||
- Google Play Services anything.
|
||||
|
||||
## Layout
|
||||
Pre-built APKs are published to an F-Droid repository:
|
||||
|
||||
```
|
||||
strawApp/ Sulkta-authored app — Compose UI, Media3 wiring, SB + RYD clients
|
||||
rust/ strawcore — UniFFI wrapper around the Rust extractor
|
||||
shared/ KMP scaffold inherited from upstream NewPipe (unused for now)
|
||||
app/ Upstream NewPipe :app module — kept for reference
|
||||
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
|
||||
|
||||
```
|
||||
./gradlew :strawApp:assembleDebug
|
||||
```
|
||||
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.
|
||||
|
||||
Requires the Rust toolchain plus the four Android targets:
|
||||
### 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
|
||||
```
|
||||
|
||||
…and `ANDROID_NDK_HOME` pointing at NDK r27c (or newer). The Gradle build runs
|
||||
`cargo ndk` + `uniffi-bindgen` automatically.
|
||||
### 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.
|
||||
GPL-3.0-or-later, inherited from upstream NewPipe. See [`LICENSE`](LICENSE).
|
||||
|
||||
## Upstream
|
||||
|
||||
This repo tracks <https://github.com/TeamNewPipe/NewPipe>. Upstream changes
|
||||
get pulled periodically via the `upstream` remote.
|
||||
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. Trademarks belong to their owners. Straw uses
|
||||
public web endpoints; nothing here authenticates to any account.
|
||||
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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue