From 920dd9e5976617da0ba33cfb1248aaf59b31420a Mon Sep 17 00:00:00 2001 From: Kayos Date: Sat, 23 May 2026 16:55:05 -0700 Subject: [PATCH] README: retire torttube, point to pv.youtube + siku2/script.service.sponsorblock --- README.md | 95 ++++++++++++++----------------------------------------- 1 file changed, 24 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index 8a2b0a2..11d0955 100644 --- a/README.md +++ b/README.md @@ -1,82 +1,35 @@ -# torttube +# torttube — RETIRED 2026-05-23 -Kodi addon for YouTube via [RustyPipe](https://codeberg.org/ThetaDev/rustypipe) -extraction + [SponsorBlock](https://sponsor.ajay.app/) segment skipping. +This addon has been retired. We reinvented an existing wheel. -Replaces the dead `plugin.video.youtube` on LibreELEC RPi TVs after Google -required account-linking for the upstream addon. +**Use these instead, both via official sources:** -## Architecture +- [`plugin.video.youtube`](https://github.com/anxdpanic/plugin.video.youtube) — playback. Has years of work on multi-Innertube-client fallback and proper DASH MPD construction. +- [`script.service.sponsorblock`](https://github.com/siku2/script.service.sponsorblock) — SponsorBlock skips for ALL YouTube playback in Kodi, including phone-cast. Polished settings UI, multi-backend support (pv.youtube, Invidious, Piped, sendtokodi), works silently in the background. -``` -Kodi (LibreELEC, RPi) - └── plugin.video.torttube [Python addon — UI, browse, SponsorBlock] - ├── torttube-sidecar [Rust binary — JSON-over-stdio] - │ ├── rustypipe [Native Rust Innertube for browse] - │ ├── yt-dlp subprocess [Fallback resolve] - │ └── sponsorblock [REST client, SHA-256 prefix lookup] - └── plugin.video.youtube [DEPENDENCY — handles HD playback] - └── inputstream.adaptive [DASH demux + decode] -``` +## What torttube was -`plugin.video.youtube` is declared as a Kodi addon dependency in -[addon.xml](addon/plugin.video.torttube/addon.xml). When a user installs -torttube, Kodi auto-fetches pv.youtube from the official Kodi addon -repository — user only manages torttube; the dep is transparent. +A LibreELEC Kodi addon for the home TVs — Rust sidecar (`rustypipe` + `yt-dlp` + SponsorBlock client) + Python plugin UI for browse/search/channels/subscriptions/watch-later. Built across 2026-05-23 in response to YouTube blocking anonymous playback on Kodi via `plugin.video.youtube`. -torttube does what it's faster at: rustypipe-backed search/channel/playlist -browse, SponsorBlock auto-skip via a tight `xbmc.Player()` monitor loop, -JSON-RPC remote-control for share-to-TV. Playback hands off to -pv.youtube via `plugin://plugin.video.youtube/play/?video_id=` — -they've spent years getting the DASH-MPD + multi-client Innertube -fallback right. Our SponsorBlock monitor runs in parallel because -`xbmc.Player()` is a global accessor that works regardless of which -addon initiated playback. +The architecture peaked at v1.0.4: +- Bundled `plugin.video.youtube` 7.4.3 zip + auto-install on first run +- Service-level SponsorBlock for all YouTube playback (including phone cast) +- Rustypipe-backed browse UI (search / channels / subs / WL) +- Native DASH MPD path (parked — audio-sync drift on long videos) +- yt-dlp progressive 360p fallback -Kodi addons are Python — the engine layer (n-param sig decoding, Innertube, -SponsorBlock hashing) lives in a Rust sidecar so we get a single maintained -extraction surface and clean aarch64/armv7 cross-compiles. +By the time v1.0.4 shipped, every job we did had an existing addon doing it better: +- Playback: pv.youtube (we were already delegating to it 100% of the time) +- SponsorBlock-for-all-YT-playback: `script.service.sponsorblock` (we wrote essentially the same code as their `Monitor` + `PlayerCheckpointListener`) +- The only piece we built that wasn't a duplicate was the rustypipe browse UI — which we only used when navigating torttube on the TV remote, not when casting from the phone -**Three-tier resolve** because YouTube actively fights every extractor: +Lessons in the [v1.0.0 → v1.0.4 commits](/Sulkta-Coop/torttube/commits/branch/main) and [closed PRs](/Sulkta-Coop/torttube/pulls?state=closed). -1. **rustypipe (Rust)** — preferred. Fast, in-process, no Python dep on the RPi. -2. **yt-dlp subprocess** — fallback when rustypipe sig-decoding falls behind YouTube's deobfuscator changes. yt-dlp updates weekly; we shell out, parse `-j` JSON. -3. **Rip-to-temp** — last resort when stream URLs 403 mid-playback (poToken expiry, cookie session mismatch). yt-dlp downloads to `/storage/.kodi/temp/torttube/.`, Kodi plays the local file. Temp dir has size cap + age cleanup. +## Repo state -## Status +- Latest tag: `v1.0.4` +- Build artifact: `plugin.video.torttube-1.0.4.zip` at `smb://lucy/downloads/torttube/` +- Sidecar Rust source: `sidecar/crates/torttube-sidecar/` (aarch64-musl cross-compile) +- Vendored: `plugin.video.youtube-7.4.3.zip` -M0 scaffold. Nothing playable yet — see [MILESTONES.md](MILESTONES.md). - -## Upstream — we fight with the FOSS extractor ecosystem, not next to it - -YouTube's anti-scraping changes hit every extractor: NewPipe, yt-dlp, Invidious, -rustypipe. Every fix we make in our sidecar gets evaluated for "is this -upstreamable?" — if yes, the fix lands at the upstream project, not just here. - -Active lanes: - -- **rustypipe** (Rust, codeberg.org/ThetaDev/rustypipe) — maintenance has slowed. - Open PR #77 "Some fixes" is unmerged as of 2026-05-23. We will either help land - it (review + ping maintainer) or fork to `Sulkta-Coop/rustypipe` if upstream - stays quiet. Forking is the worst case, not the first move. -- **NewPipeExtractor** (Java, github.com/TeamNewPipe/NewPipeExtractor) — actively - maintained, 177 open issues. We use it as the reference implementation for - Innertube behaviour. PRs to NPE land in Rust here via rustypipe, and vice - versa. -- **yt-dlp** (Python, github.com/yt-dlp/yt-dlp) — the gold standard. We're more - consumers than contributors here, but if our rip-to-temp tier surfaces a - specific extractor bug we file it. - -Issues we're watching: -- [NPE #1339](https://github.com/TeamNewPipe/NewPipeExtractor/issues/1339) — n-parameter deobfuscation -- [NPE #1444](https://github.com/TeamNewPipe/NewPipeExtractor/issues/1444) — distinguish unavailable vs unextractable -- [NPE #1360](https://github.com/TeamNewPipe/NewPipeExtractor/issues/1360) — refactor link handlers (help wanted) -- [NPE #1357](https://github.com/TeamNewPipe/NewPipeExtractor/issues/1357) — JDoc checks in PR pipeline (good first issue) -- [rustypipe PR #77](https://codeberg.org/ThetaDev/rustypipe/pulls/77) — open as of 2026-05-23, unmerged - -Contribution log lives at [docs/upstream.md](docs/upstream.md) — every PR we -file lands there with its outcome. - -## License - -GPL-3.0-or-later. Matches RustyPipe and NewPipeExtractor. +Repo archived on Gitea 2026-05-23.